Ruby、不可变整数和未使用的对象

pyt*_*les 3 ruby integer immutability

a = 1
a += 1
=> 2
Run Code Online (Sandbox Code Playgroud)

原始对象1现在未使用,这不是很有表现力。为什么整数在 ruby​​ 中是不可变的?我看过stackoverflow,但找不到任何解释。

Sch*_*ern 5

Integers 和所有Numerics都是不可变的,所以每个都只有一个。我们可以通过检查他们的#object_id.

2.6.4 :001 > a = 1
 => 1 
2.6.4 :002 > a.object_id
 => 3 
2.6.4 :003 > 1.object_id
 => 3 
2.6.4 :004 > b = 1
 => 1 
2.6.4 :005 > b.object_id
 => 3 
Run Code Online (Sandbox Code Playgroud)

此行为也记录在 Numeric 中。

其他核心数字类 [Numeric 以外的] 如 Integer 被实现为立即数,这意味着每个 Integer 都是一个始终按值传递的单个不可变对象。例如,整数 1 只能有一个实例。Ruby 通过防止实例化来确保这一点。如果尝试复制,则返回相同的实例。

为每个 Integer 设置一个不可变对象可以在正常使用中节省内存,因此您将使用1很多。每个人共享相同1的东西可以节省大量内存,但这意味着它必须是不可变的,否则添加到一个对象会改变其他对象,这会很糟糕

不必一遍又一遍地重新分配和分配相同的 Integer 会更快,并减少内存碎片。如果它们真的没有使用,Ruby 会垃圾收集它们。Ruby 的垃圾收集正在不断改进,并且可以使用许多环境变量进行调整。

它还简化了它们的实现并提高了它们的性能。不可变对象可以缓存任何计算,确信缓存永远不需要失效。