假设我们有这段代码:
def something(*someargs)
return *someargs.join(",")
end
现在,我发现你可以像方法定义中的任何地方一样引用* someargs。但我尝试了这个...将* someargs作为字符串返回,用逗号分隔。然而,当我称这种方法时:
a = something(4, 5)
p a.class # => Array
p a #> ["4,5"]
为什么(4,5)仍会返回数组?如果我做这样的事情:
[4, 5].join(",")
结果将是不在数组中的字符串。所以我的问题是,如何让“something”方法返回一个包含所有参数字符串的实际字符串。这很奇怪,因为如果我做* someargs.class,结果是“数组”,但它的行为不像典型的数组......
答案 0 :(得分:2)
尝试以下:
def something(*someargs)
return someargs.join(",")
end
a = something(4, 5)
p a.class # => String
p a # => "4,5"
解释您案件的一个例子:
a = *"12,11"
p a # => ["12,11"]
因此,当您return *someargs.join(",")
时,someargs.join(",")
将字符串创建为"4,5"
。但现在您在已评估的字符串"4,5"
上再次使用splat运算符(*)分配操作,如a = *"4,5"
。所以最后你得到["4,5"]
。
使用splat运算符阅读更多方案 - Splat Operator in Ruby
希望有所帮助。
答案 1 :(得分:-3)
前缀为splat *...
的对象不是对象。你不能引用这样的东西,也不能将它作为参数传递给方法,因为没有这样的东西。但是,如果您有一个可以接受多个参数的方法,例如puts
,那么您可以执行以下操作:
puts *["foo", "bar"]
在这种情况下,没有*["foo", "bar"]
这样的东西。 splat运算符将其扩展为多个参数。它相当于:
puts "foo", "bar"
关于为someargs
之后someargs.join(",")
仍为数组的原因。那是因为join
不是一种破坏性的方法。它对接收器没有任何作用。此外,对象不能通过破坏性方法改变其类。将someargs
的引用从数组更改为字符串的唯一方法是重新分配它。