我刚开始学习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 Fixnum
c的值在inn(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中的所有内容都是对象,为什么arr会更改其值,而c(一个Fixnum对象)却不会更改其值?
您的想法受到赞赏。 :)谢谢
答案 0 :(得分:4)
在Ruby中有一些“特殊”对象是不可变的。 Fixnum
是其中之一(其他是布尔值,nil
,符号和其他数字)。 Ruby也是按值传递的。
n = n + 1
不会修改n
,而是在increase
的范围内重新分配局部变量。
由于Fixnum
是不可变的,因此与数组不同,您无法使用任何方法来更改其值,而数组可以使用多种方法进行变异,<<
是其中之一。
add_element
用<<
显式修改传递的对象。如果您将方法主体更改为
array = array + [item]
然后,第二个示例中的输出将为array is [1, 2, 3, 4]
,因为它只是对局部变量的重新分配。