Ruby “有吗?”;规则“;红宝石糖?

Ruby “有吗?”;规则“;红宝石糖?,ruby,Ruby,我正在学习Ruby的基础知识(刚开始),我遇到了一些问题。它是以 a = ["foo", 1, "bar", 2] => ["foo", 1, "bar", 2] Hash[*a] => {"foo"=>1, "bar"=>2} 经过一番思考,我发现Hash[*a]相当于Hash.[](*a)或Hash.[]*a。我的问题是为什么会这样。是什么让你把*a放在方括号内,还有什么规则规定何时何地可以使用“it” 编辑:我的措辞似乎引起了一些混乱。我不是问阵列扩展的问题。我明

我正在学习Ruby的基础知识(刚开始),我遇到了一些问题。它是以

a = ["foo", 1, "bar", 2]
=> ["foo", 1, "bar", 2]
Hash[*a]
=> {"foo"=>1, "bar"=>2}
经过一番思考,我发现
Hash[*a]
相当于
Hash.[](*a)
Hash.[]*a
。我的问题是为什么会这样。是什么让你把
*a
放在方括号内,还有什么规则规定何时何地可以使用“it”

编辑:我的措辞似乎引起了一些混乱。我不是问阵列扩展的问题。我明白了。我的问题基本上是:如果
[]
是一个方法名,为什么可以将参数放在括号内?这似乎——但不完全——像是说,如果你有一个方法
Foo.dood
,你想把字符串
“hey”
传递给它,那么你就可以写
Foo.do“hey”od

散列[“a”、“b”、“c”、“d”]
相当于
散列。[](“a”、“b”、“c”、“d”)
。Ruby中几乎所有的东西都是方法调用
5+5
相当于
5.+(5)

给定的
a=[“a”,“b”,“c”,“d”]
散列[*a]
相当于
散列[“a”,“b”,“c”,“d”]
,而散列[/code>又相当于
散列。[](“a”,“b”,“c”,“d”)
。类似地,
foo(*a)
相当于
foo(“a”、“b”、“c”、“d”)
这称为分解运算符,允许将数组发送到方法,并将数组中的每个项作为方法的一个参数进行计数,而不是将数组作为第一个参数发送到方法


为了明确回答您的更新,没有什么特别的东西可以让您将
*a
放在括号内。括号只是普通方法调用的糖。这里唯一的“特殊”是,您可以向任何方法发送
*a

方法告诉ruby不要将数组作为数组,而是使用“扩展”数组

例如:

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]
散列[*a]

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

ruby允许您以一种特殊的方式调用几个方法。这些是您提到的
[]
、其他人提到的
+
-
==
等。另一个重要的例子是
something=(value)
形式的方法,它可以通过
object.something=value
调用,并允许您创建访问器

编辑:

有趣的事实1:如果你定义一个
+
方法,你可以免费得到
+=


有趣的事实2:如果你定义了一个
你就得到了所有的比较方法,感谢我认为Ruby的语法是在parse.y中为YARV Ruby定义的。

那么什么是[所有]允许splat扩展的地方呢?(至少还有一个与AFAIK方法调用无关。)是否更新?我没有更新任何东西。那么,您是说,在Ruby中,只要有方括号作为方法名出现,就可以使用方括号而不是圆括号来包含参数列表?也就是说,任何采用参数a、b和c的旧方法
Foo.[]
都可以写成
Foo[a、b、c]
?这只是一种神奇的语言特征吗?没错。名为[]的方法可以通过
my\u obj[foo]
sugar调用。名为[]=的方法可以通过
my_obj[foo]=bar
调用。这将转换为
my_obj.[]=(foo,bar)
。这就是
Hash
实例语法的基础。还有一个
Dir[“glob pattern”]
,它可以转换为
Dir.[](“glob pattern”)
。好吧,那么是什么让它起作用的,和/或是在什么地方有这些特殊方法名称的列表?我不知道MRI是如何在C中实现的。我也不知道列表。对,但这在哪里是允许的还是不允许的?(例如,生产规则是什么?)
a
是一个数组,
*a
是一个参数列表。因此,问题不是,
*a
是否允许,而是:我需要一个数组作为参数,还是需要一个参数列表。我的问题不是关于数组扩展。这是关于
[]
方法的,特别是为什么可以将参数放在括号内。我看到很多答案都集中在方法调用中的
*a
。但是,如果能看到其他的产品,比如为什么
[1,*a]
能“按预期”工作(这会产生与
[1,a]
不同的结果)以及为什么
[*a,1]
是无效的,那就太好了。看到“splat”如何与赋值相关,以及它如何能够/确实与Ruby的赋值分解交互,也会很高兴。。。也许可以说是一个完全不同的问题;-)如果有一个半正式的ruby规范就太好了。链接到准规范会让答案更好。@pst:好问题。如果你问了一个新的SO问题,请在这里发布链接,这样我就可以了解它。注意,通常使用它的方法是发送一个对数组:Hash[[[key1,value1],[key2,value2]]@pst:有一种半正式的Ruby规范:。另外,
[*a,1]
在1.9中也可以使用,多个splat也是如此。那么,在这个“特殊”的东西的某个地方有一个列表吗?有一个可以覆盖的操作符列表