Ruby语法糖有“规则”吗?

时间:2011-10-09 18:44:19

标签: ruby

我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[] method。它是随着

引入的
a = ["foo", 1, "bar", 2]
=> ["foo", 1, "bar", 2]
Hash[*a]
=> {"foo"=>1, "bar"=>2}

经过一番思考,我发现Hash[*a]相当于Hash.[](*a)Hash.[] *a。我的问题是为什么会这样。是什么让你把*a放在方括号内,是否有某种规则可以用于何时何地使用“它”?

编辑:我的措辞似乎引起了一些混乱。我不是在询问阵列扩展。我明白了。我的问题基本上是:如果[]是一个方法名称,为什么可以在括号内放置参数?看起来差不多 - 但不完全 - 就像说如果你有一个方法Foo.dood,并且想要将字符串"hey"传递给它,那么你可以写Foo.do"hey"od。< / p>

4 个答案:

答案 0 :(得分:4)

Hash["a", "b", "c", "d"]相当于Hash.[]("a", "b", "c", "d")。 Ruby中几乎所有东西都是方法调用。 5 + 5相当于5.+(5)

鉴于a = ["a", "b", "c", "d"] Hash[*a]相当于Hash["a", "b", "c", "d"],而Hash.[]("a", "b", "c", "d")相当于foo(*a)。类似地,foo("a", "b", "c", "d")等同于*a这称为爆炸运算符,并允许将数组发送到方法并使数组中的每个项都计为方法的一个参数,而不是发送数组作为第一个参数的方法。


要专门回答您的更新,您可以将*a放在括号内。括号只是正常方法调用的糖。这里唯一的“特殊”事情是您可以将{{1}}发送到任何方法。

答案 1 :(得分:3)

ruby​​允许您以特殊方式调用几种方法。这些是您提到的[]+-==等等。另一个重要的示例是something=(value)形式的方法,可以使用object.something = value调用,并允许您创建访问者。

编辑:

有趣的事实1:如果您定义+方法,则免费获得+=

有趣的事实2:如果您定义<=>,您将获得所有比较方法,由Comparable提供

答案 2 :(得分:2)

我认为Ruby的语法是在YARV Ruby的parse.y中定义的。

答案 3 :(得分:0)

*<Array>方法告诉ruby不要将数组作为数组,而是使用'expanded'数组。

示例:

def test(*argv)
  p argv
end

a = [1,2,3]
test(a) #-> [[1, 2, 3]]
test(*a) #-> [1, 2, 3]    

使用test(a)数组a是唯一的参数。

使用test(*a) a作为参数列表。


在你的情况下

a = ["foo", 1, "bar", 2]
Hash[*a]

类似于

Hash["foo", 1, "bar", 2]

Hash[*a]将是

Hash[["foo", 1, "bar", 2]]