我正在通过RubyMonk学习Ruby。在解决waiter robot problem,有一行代码,创建使用数组一个新的哈希:Ruby:使用一组键/值设置一个新的散列
o = Hash[*order]
给出
order = [:table, 1, :sandwich, "denver", :drink, "mango shake"]
我明白什么正在这里做,以及如何图示操作者的作品。不过,我对创建这个散列的语法感到困惑。 RubyDoc说::[]
真的是被调用的方法,所以我能够确定o = Hash::[](*order)
是同样的事情。但为什么可以缩短为Hash[*order]
?这是一个由解析器解析的特殊构造,还是有其他原因?沿着同样的路线,为什么不做以下任何工作?
o = Hash.new
o.[](*order)
或
o = Hash.new
o[*order]
,甚至像o = {}[*order]
我知道这些不应该工作;我只是不知道为什么。我想我没有先用Hash.new
实例化一个散列,而是使用Hash[*order]
而感到困惑。这是类方法和实例方法之间区别的例子吗?
(作为一个侧面说明,在我看来那o = {*order}
应该工作,但事实并非如此。)
有人能解释这是怎么回事就在这里,如果有其他方法,从数组中添加值成哈希?
谢谢,这有帮助。那么为什么你不能'哈希(*订单)'?我很困惑,在这里如何使用方括号是有意义的。 – sgroves 2013-04-23 20:32:24
@sgroves该语法调用'Kernel#Hash',链接到我更新的答案的最后一行。 – 2013-04-23 20:40:46
'Hash []'是一种便利的类方法,当您调用'object []'时,它与Hash []'是不同的方法。检出[Hash class docs](http://www.ruby-doc.org/core-1.9.3/Hash.html)并查找两个不同的[]'方法。另外'[]'是语言中的一个特殊的分析案例,它基本上是'object。[](args)''。 – Azolo 2013-04-23 20:41:25