什么时候在Ruby中使用Struct而不是Hash?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我没有太多的编程经验。但是,对我来说,Struct看起来有点类似于Hash。

  • Struct可以做什么?
  • 有什么struct可以做,hash不能做?

提问于
用户回答回答于

struct与使用hashmaps不同:

  • 一个struct具有一组固定的属性,而您将新键添加到散列。
  • 调用struct实例中不存在的属性将导致NoMethodError,同时从hash获取不存在的键的值将仅返回nil。
  • 即使struct具有相同的属性并且具有相同的值(即为Struct.new(:x).new(42) == Struct.new(:x).new(42)假,而Foo = Struct.new(:x); Foo.new(42)==Foo.new(42)属实),不同struct的两个实例永远不会相等。
  • to_astruct的方法返回值的数组,而to_a在hash上得到一个键 - 值对的数组(其中“对”表示“二元数组”)
  • 如果Foo = Struct.new(:x, :y, :z),可以Foo.new(1,2,3)创建一个实例Foo而不必拼出属性名称。

所以要回答这个问题:当你想用一组已知的属性建模对象时,使用结构。当你想要使用hashmaps建模任意时,用hash。

用户回答回答于

Struct更快

require 'benchmark'

Benchmark.bm 10 do |bench|
  bench.report "Hash: " do
    50_000_000.times do { name: "John Smith", age: 45 } end
  end

  bench.report "Struct: " do
    klass = Struct.new(:name, :age)
    50_000_000.times do klass.new("John Smith", 45) end
  end

end

# ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32].
#                 user     system      total        real
# Hash:       22.340000   0.016000  22.356000 ( 24.260674)
# Struct:     12.979000   0.000000  12.979000 ( 14.095455)

# ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin11.0]
# 
#                  user     system      total        real
# Hash:       31.980000   0.060000  32.040000 ( 32.039914)
# Struct:     16.880000   0.010000  16.890000 ( 16.886061)

扫码关注云+社区