这些看似相同。是否存在偏好,性能差异等?
Hash[[[:a, 'foo'], [:b, 'bar']]]
#=> {:a=>"foo", :b=>"bar"}
[[:a, 'foo'], [:b, 'bar']].to_h
#=> {:a=>"foo", :b=>"bar"}
答案 0 :(得分:7)
他们不一样。两者都可以采用一系列数组:
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]}
虽然给它奇数个元素通常会返回一个错误,这将有助于你进行调试:
Hash[1, 2, 3]
#=> ArgumentError: odd number of arguments for Hash
使用某种元素,它会静默地返回一个空哈希(但带有警告),这很难调试:
Hash[[1, 2]]
#=> {}
#=> warning: wrong element type Fixnum at 0 (expected array)
出于这个原因,Hash.[]
很棘手。由于引入了Array#to_h
,因此没有理由使用Hash.[]
。 Array#to_h
更好。 Ruby开发人员不会仅仅因为兼容性而删除Hash.[]
。