Join不会将splat参数转换为Ruby中的字符串

时间:2013-10-30 12:58:59

标签: ruby

假设我们有这段代码:

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,结果是“数组”,但它的行为不像典型的数组......

2 个答案:

答案 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的引用从数组更改为字符串的唯一方法是重新分配它。