首页 > 解决方案 > 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的值在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 中的一切都是对象,为什么 arr 会改变它的值,而 c(一个 Fixnum 对象)却不会改变它的值呢?

感谢您的想法。:) 谢谢

标签: rubyobjectadditionfixnum

解决方案


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

n = n + 1不修改,它重新分配' 范围内n的局部变量。increase由于Fixnum它是不可变的,因此没有任何方法可以用来更改它的值,这与数组不同,数组可以通过多种方法进行变异,<<作为其中之一。

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

array = array + [item]

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


推荐阅读