这些似乎是相同的.有偏好,性能差异等吗?
Hash[[[:a, 'foo'], [:b, 'bar']]]
#=> {:a=>"foo", :b=>"bar"}
[[:a, 'foo'], [:b, 'bar']].to_h
#=> {:a=>"foo", :b=>"bar"}
Run Code Online (Sandbox Code Playgroud)
他们不一样.两者都可以采用数组:
Hash[[[1, 2], [3, 4]]] #=> {1=>2, 3=>4}
[[1, 2], [3, 4]].to_h #=> {1=>2, 3=>4}
Run Code Online (Sandbox Code Playgroud)
但除此之外,Hash.[]还有更古怪的语法.它可以直接接受元素:
Hash[1, 2, 3, 4] #=> {1=>2, 3=>4}
Run Code Online (Sandbox Code Playgroud)
如果您尝试介于两者之间,您会得到意想不到的结果:
Hash[[1, 2], [3, 4]] #=> {[1, 2]=>[3, 4]}
Run Code Online (Sandbox Code Playgroud)
虽然给它奇数个元素通常会返回一个错误,这将有助于你进行调试:
Hash[1, 2, 3]
#=> ArgumentError: odd number of arguments for Hash
Run Code Online (Sandbox Code Playgroud)
对于某些类型的元素,它将静默地返回一个空哈希(但带有警告),这将很难调试:
Hash[[1, 2]]
#=> {}
#=> warning: wrong element type Fixnum at 0 (expected array)
Run Code Online (Sandbox Code Playgroud)
出于这个原因,Hash.[]很棘手.自Array#to_h推出以来,没有理由使用Hash.[].Array#to_h更好.Ruby开发人员不会Hash.[]仅仅为兼容性而删除.