Fixnum对象在增加后不会更改值

时间:2018-11-25 14:41:58

标签: ruby object addition fixnum

我刚开始学习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对象)却不会更改其值?

您的想法受到赞赏。 :)谢谢

1 个答案:

答案 0 :(得分:4)

在Ruby中有一些“特殊”对象是不可变的。 Fixnum是其中之一(其他是布尔值,nil,符号和其他数字)。 Ruby也是按值传递的。

n = n + 1不会修改n,而是在increase的范围内重新分配局部变量。 由于Fixnum是不可变的,因此与数组不同,您无法使用任何方法来更改其值,而数组可以使用多种方法进行变异,<<是其中之一。

add_element<<显式修改传递的对象。如果您将方法主体更改为

array = array + [item]

然后,第二个示例中的输出将为array is [1, 2, 3, 4],因为它只是对局部变量的重新分配。