我刚开始学习Ruby,遇到了这两个函数:
def increase(n)
n = n + 1
return n
end
def add_element(array, item)
array << item
end当我尝试使用n=5增加(N)时
c = 5
p10.increase(c)
print("c is #{c}\n")
print("c.class is #{c.class}\n")
--> c is 5
--> c.class is FixnumC的值在increase(n)内增加后不变
当我尝试用add_element修改数组arr = 1,2,3,4的内容时,arr确实改变了。
arr = [1, 2, 3, 4]
p10.add_element(arr, 5)
print("array is #{arr}\n")
--> array is [1, 2, 3, 4, 5]那么,如果Ruby中的一切都是object,为什么arr会改变它的值,而c(一个Fixnum对象)却不会改变它的值呢?
非常感谢您的想法。:)谢谢
发布于 2018-11-25 22:51:38
Ruby中有一些“特殊”的对象是不可变的。Fixnum就是其中之一(其他是布尔值、nil、符号、其他数字)。Ruby也是通过值传递的。
n = n + 1不修改n,它在increase的作用域中重新分配一个局部变量。因为Fixnum不是可变的,所以没有方法可以用来改变它的值,这与数组不同,数组可以用多个方法来改变,<<就是其中之一。
add_element使用<<显式修改传递的对象。如果将方法体更改为
array = array + [item]那么第二个示例中的输出将是array is [1, 2, 3, 4],因为它仅仅是一个局部变量的重新赋值。
https://stackoverflow.com/questions/53468624
复制相似问题