这是我在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]
答案 0 :(得分:1)
Ruby是一种值得传递的“一切都是对象”的语言。数组是对象。当您使用数组作为函数的参数时,实际上是将引用传递给该数组,这是可变的。
执行赋值时,实际上是在创建另一个引用并将该引用的值存储在给定范围内。
如果要更改参数的类型,则必须在调用范围中进行分配。 Ruby没有符号表别名功能。