Hash[] vs to_h,它们是否相同,如果相同,哪个更好?
Hash[] vs to_h, are they the same, and if so which is better?
这些似乎是相同的。是否有偏好、性能差异等?
Hash[[[:a, 'foo'], [:b, 'bar']]]
#=> {:a=>"foo", :b=>"bar"}
[[:a, 'foo'], [:b, 'bar']].to_h
#=> {:a=>"foo", :b=>"bar"}
它们不一样。两者都可以采用数组数组:
Hash[[[1, 2], [3, 4]]] #=> {1=>2, 3=>4}
[[1, 2], [3, 4]].to_h #=> {1=>2, 3=>4}
但除此之外,Hash.[]
有更古怪的语法。可以直接接受元素:
Hash[1, 2, 3, 4] #=> {1=>2, 3=>4}
如果你尝试介于两者之间,你会得到意想不到的结果:
Hash[[1, 2], [3, 4]] #=> {[1, 2]=>[3, 4]}
虽然给它奇数个元素通常 return 是一个错误,这将有助于您调试:
Hash[1, 2, 3]
#=> ArgumentError: odd number of arguments for Hash
对于某些类型的元素,它会默默地return一个空散列(但有警告),这将很难调试:
Hash[[1, 2]]
#=> {}
#=> warning: wrong element type Fixnum at 0 (expected array)
因此,Hash.[]
很棘手。既然引入了Array#to_h
,就没有理由再使用Hash.[]
。 Array#to_h
更好。 Ruby 开发人员不会仅仅为了兼容性而删除 Hash.[]
。
这些似乎是相同的。是否有偏好、性能差异等?
Hash[[[:a, 'foo'], [:b, 'bar']]]
#=> {:a=>"foo", :b=>"bar"}
[[:a, 'foo'], [:b, 'bar']].to_h
#=> {:a=>"foo", :b=>"bar"}
它们不一样。两者都可以采用数组数组:
Hash[[[1, 2], [3, 4]]] #=> {1=>2, 3=>4}
[[1, 2], [3, 4]].to_h #=> {1=>2, 3=>4}
但除此之外,Hash.[]
有更古怪的语法。可以直接接受元素:
Hash[1, 2, 3, 4] #=> {1=>2, 3=>4}
如果你尝试介于两者之间,你会得到意想不到的结果:
Hash[[1, 2], [3, 4]] #=> {[1, 2]=>[3, 4]}
虽然给它奇数个元素通常 return 是一个错误,这将有助于您调试:
Hash[1, 2, 3]
#=> ArgumentError: odd number of arguments for Hash
对于某些类型的元素,它会默默地return一个空散列(但有警告),这将很难调试:
Hash[[1, 2]]
#=> {}
#=> warning: wrong element type Fixnum at 0 (expected array)
因此,Hash.[]
很棘手。既然引入了Array#to_h
,就没有理由再使用Hash.[]
。 Array#to_h
更好。 Ruby 开发人员不会仅仅为了兼容性而删除 Hash.[]
。