Ruby 为什么在类中返回change变量

Ruby 为什么在类中返回change变量,ruby,class,variables,Ruby,Class,Variables,我无法理解这种ruby行为,代码更好地解释了我的意思: class DoNotUnderstand def initialize @tiny_array = [3,4] test end def messing(ary) return [ary[0]+=700, ary[1]+=999] end def test puts @tiny_array.join(",") # before =

我无法理解这种ruby行为,代码更好地解释了我的意思:

class DoNotUnderstand
    def initialize
        @tiny_array = [3,4]
        test
    end

    def messing(ary)
        return [ary[0]+=700, ary[1]+=999]
    end

    def test
        puts @tiny_array.join(",")  # before => 3,4
        messing(@tiny_array)
        puts @tiny_array.join(",")  # after  => 703,1003
    end
end

question = DoNotUnderstand.new
@tiny_array
过去是
[3,4]
,现在变成了
[7031003]

如果不使用类,则会发生以下情况:

@tiny = [1,2]
def messing(ary)
    return [ary[0]+693,ary[1]+999]
end

puts @tiny.join(",")                        # before  => 1,2
messing(@tiny)
puts @tiny.join(",")                        # after   => 1,2
数组只保留
[1,2]


为什么?

您的第二个代码示例(来自类外的代码示例)缺少第一个代码示例中的两个字符,这两个字符使它能够正常工作。在第一个示例中,使用了
+=
操作符,在适当的位置修改数组:

return [ary[0]+=700, ary[1]+=999]
在第二个示例中,使用了
+
运算符,使数组保持原样:

return [ary[0]+693,ary[1]+999]

如果您使用
+=
操作符对其进行更改,则其工作方式与第一个代码段相同。

该类是一个转移注意力的类,与问题完全无关

在第一种情况下,修改了数组,您将
messing
定义为:

def messing(ary)
  return [ary[0]+=700, ary[1]+=999]
end
def messing(ary)
  return [ary[0]+693,ary[1]+999]
end
而在第二种情况下,在未修改数组的情况下,您将
messing
定义为:

def messing(ary)
  return [ary[0]+=700, ary[1]+=999]
end
def messing(ary)
  return [ary[0]+693,ary[1]+999]
end
在一种情况下,您使用了
+=
,而在另一种情况下,您仅使用了
+

ary[0]+=700
完全等同于
ary[0]=ary[0]+700
。换句话说,您正在更改存储在
ary
的第0个索引中的值

在第二种情况下,您只需添加存储在数组中的值并返回结果,但在第一种情况下,您不仅返回结果,还将其存储在数组中

有关为什么修改
ary
会修改
@tiny_array
的解释,请参见问题