方法更改参数数组的值,除非参数设置为nil?

时间:2014-01-05 01:38:35

标签: ruby-on-rails ruby arrays

这是我在rails控制台中测试的方法。

def self.increment_index_array(index_array, sizes_array, last_index)
    index_array[last_index] += 1
    for i in (last_index).downto(0)
        if index_array[i] == sizes_array[i]
            if i == 0
                index_array = nil
                return index_array
            end 
            index_array[i] = 0
            index_array[i-1] += 1
        else
            break
        end
    end
    return index_array
end

我一直在控制台上定义一个index_array变量并将其传递给方法。该方法对index_array变量具有破坏性。调用该方法将返回递增的数组,但也会更改方法(控制台)之外的范围中的变量值,这是所需的。但是,当我在方法内部将数组设置为nil时,此更改不会反映在外部范围中。为什么是这样?有没有办法在外部范围内使变量为零?

示例控制台会话:

1.9.1 :191 > index = [64, 2, 3]
 => [64, 2, 3] 
1.9.1 :192 > sizes = [65, 3, 5]
 => [65, 3, 5]  
1.9.1 :193 > increment_index_array(index, sizes, 2)
 => [64, 2, 4] 
1.9.1 :194 > index
 => [64, 2, 4] 
1.9.1 :195 > increment_index_array(index, sizes, 2)
 => nil 
1.9.1 :196 > index
 => [65, 0, 0] 

1 个答案:

答案 0 :(得分:1)

Ruby是一种值得传递的“一切都是对象”的语言。数组是对象。当您使用数组作为函数的参数时,实际上是将引用传递给该数组,这是可变的。

执行赋值时,实际上是在创建另一个引用并将该引用的值存储在给定范围内。

如果要更改参数的类型,则必须在调用范围中进行分配。 Ruby没有符号表别名功能。