Ruby “有吗?”;规则“;红宝石糖?
我正在学习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” 编辑:我的措辞似乎引起了一些混乱。我不是问阵列扩展的问题。我明
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也是如此。那么,在这个“特殊”的东西的某个地方有一个列表吗?有一个可以覆盖的操作符列表