【问题标题】:Ruby array manipulation inside method方法内部的 Ruby 数组操作
【发布时间】:2019-01-08 10:53:58
【问题描述】:

在下文中,input_1 发生变化:

def method_1(a)
  a << "new value"
end

input_1 = []
method_1(input_1)
input_1 #=> ["new value"]

在下面,input_2 不变:

def method_2(a)
  a = ["new value"]
end

input_2 = []
method_2(input_2)
input_2 #=> []

为什么input_1 会改变而input_2 不会改变?

【问题讨论】:

  • 您的问题到底是什么?您希望两次输入的值都是['new value']
  • 为什么改变 input_1 而 input_2 没有改变?
  • 这个概念被称为“可变性”。 method_2 只是分配一个与另一个同名的新变量。

标签: ruby local-variables


【解决方案1】:

归结为 Ruby 使用“按值传递引用”。

this excellent blog post 中描述了您遇到的确切情况。

要点:

method_1 中,您正在更改两个不同变量(input_1a)都指向的对象的值。

method_2 中,您将一个全新的对象重新分配给两个变量之一 (a)。

【讨论】:

    【解决方案2】:

    简单来说,我们可以说 Ruby 中的变量是对值的引用。在您的情况下,变量 a 包含对数组的引用。

    a &lt;&lt; (a.append) 改变存储在变量a 中的。引用没有改变,但值改变了。 method_1是这样的

    def method_1(a)
        a << "new value"
    end
    

    赋值= 改变了存储在变量中的引用——它开始指向不同的值。引用在传递给方法时被复制。因为当你打电话时

    def method_2(a)
        a = ["new value"]
    end
    input = []
    method_2(a)
    

    您只更改存储在方法本地的a 中的引用,而不更改存储在input 中的引用,也不更改此引用指向的值(和[] 的数组)。

    【讨论】:

    • 请注意,如果将调用更改为 input_2 = method_2(input_2),则由 method_2 生成的新引用将分配给 input_2,因为 Ruby 方法返回其上次评估的结果。
    【解决方案3】:

    为什么input_1 改变而input_2 没有改变?

    这个问题的非常简单的答案是你的前提是错误的。 input_1 不会改变。 input_1 引用的对象发生了变化,但这与input_1 完全不同。事物的名称​​不与事物本身相同。 (巫术之外。)

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 2017-01-14
      • 2015-10-17
      • 2021-12-03
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多