Hash [] vs to_h,它们是否相同,如果是这样哪个更好?

时间:2015-02-03 15:22:13

标签: ruby hash

这些看似相同。是否存在偏好,性能差异等?

Hash[[[:a, 'foo'], [:b, 'bar']]]
#=> {:a=>"foo", :b=>"bar"}
[[:a, 'foo'], [:b, 'bar']].to_h
#=> {:a=>"foo", :b=>"bar"}

1 个答案:

答案 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.[]