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

时间:2016-10-31 19:19:50

标签: ruby class variables

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

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]并成为[703,1003]
如果我不上课,那就会发生:

@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]
为什么呢?

2 个答案:

答案 0 :(得分:6)

这个课程是一个红色的鲱鱼,与这个问题完全无关。

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

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

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

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

在一个案例中,您使用了+=,而在另一个案例中,您只使用了+

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

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

有关修改ary修改@tiny_array的原因的说明,请参阅问题this answerIs Ruby pass by reference or by value?

答案 1 :(得分:2)

你是第二个代码示例(来自类外部的那个)缺少第一个使它按照它的方式工作的两个字符。在第一个示例中,使用+=运算符,修改数组:

return [ary[0]+=700, ary[1]+=999]

在第二个示例中,使用了+运算符,将数组保留为:

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

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