ruby - 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 对象)却不会改变它的值呢?
感谢您的想法。:) 谢谢
解决方案
Ruby 中有一些“特殊”的对象是不可变的。Fixnum
是其中之一(其他是布尔值nil
、符号、其他数字)。Ruby 也是按值传递的。
n = n + 1
不修改,它重新分配' 范围内n
的局部变量。increase
由于Fixnum
它是不可变的,因此没有任何方法可以用来更改它的值,这与数组不同,数组可以通过多种方法进行变异,<<
作为其中之一。
add_element
用 .显式修改传递的对象<<
。如果将方法主体更改为
array = array + [item]
那么第二个示例中的输出将array is [1, 2, 3, 4]
只是对局部变量的重新分配。
推荐阅读
- python - 如何使用 SQLite/SQLAlchemy 创建数据库表?
- r - ggplot2:直方图,以不同的阈值为每个方面着色
- laravel - Laravel API 不接受来自 Postman 的 JSON 请求
- php - 如何在没有`foreach`和没有`for`的情况下使用PHP手动迭代数组/对象
- excel - 将 Excel 图表复制/粘贴到 PowerPoint 错误
- powershell - powershell:坚持使用简单的 DateTime 脚本
- c# - 从 Selenium 客户端获取剪贴板中的数据
- react-native - 无法在 apk 上显示博览会推送令牌
- reactjs - 三元运算符:期望一个赋值或函数调用,而是看到一个表达式
- android - 线性布局未显示在回收站视图下方