【问题标题】:concatenate with splat ruby与 splat ruby​​ 连接
【发布时间】:2014-01-18 16:48:59
【问题描述】:

说我有

arr = [1,2,3]

如何更改此方法,以便将每个参数添加到数组中?

def add(*number)
  arr << *number
end

所以add(4,5,6) 产生:

arr #=> [1,2,3,4,5,6]

【问题讨论】:

  • 我的问题被否决的原因是什么?这是个坏问题吗?
  • 看起来有人带着一大堆反对票跑来跑去,没有意识到他们每传出一张票,就会得到一张。我会给你 +1。

标签: ruby splat


【解决方案1】:

当通过 splat 接受参数时,它们将始终是一个数组。所以你可以简单地将两个数组加在一起。

def add(*numbers)
  arr + numbers
end

【讨论】:

  • arr 如何在 def 中有效? arr 不会被识别为 def add 的局部变量。
  • 这在哪个版本的 ruby​​ 中有效?我得到错误:undefined local variable or method 'arr' for main:Object (NameError)
  • 这是一个人为的例子...给定示例代码和所陈述的问题,这就是您将如何更改该代码以实现所需结果的方式。 arr 的范围与此问题无关。
  • 值得注意的是#&lt;&lt; 追加,而#+ 创建一个新数组。
  • @jonahb &lt;&lt; 附加单个元素。使用arr += [4,5,6] 追加整个数组。
【解决方案2】:

使用concat:

def add(*nums)
  arr.concat nums
end

+:

def add(*nums)
  arr + nums
end

【讨论】:

  • 它们不同:concat 修改了接收者。
【解决方案3】:
$arr = [1,2,3]

def add(*number)
  $arr.concat number
end

add(4,5,6)

$arr #=> [1,2,3,4,5,6]

注意:concat 修改它所操作的对象 ($arr)。加号 (+) 没有。

正如 Tin Man 所说,您不想使用全局变量来执行此操作。不如干脆做

arr.concat [4,5,6]

在函数调用之外。更好的是:

arr += [4,5,6]

【讨论】:

  • 不,不,不。不要使用全局来解决简单的范围问题。
  • @theTinMan 问题和接受的答案都尝试使用全局变量,但由于缺少全局前缀符号$ 而失败。这至少显示了如何以 OP 所需的方式正确执行此操作。无论如何,答案已更新以解决您的评论。
  • 在回答问题时,我们会遇到很多非常糟糕的编程示例。当我们在回答中模仿他们的错误代码时,我们并没有真正为他们服务好;相反,我们只会使他们缺乏知识。相反,我们应该回答他们的问题并展示正确的方法。这类似于给他们鱼与教他们如何钓鱼的想法。向他们展示如何正确地做到这一点可能会阻止其他领域的未来问题。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2013-07-04
  • 2017-01-09
  • 2010-10-29
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多