我有這樣的Ruby代碼:爲什麼Ruby爲「var = var + 1」而不是「var = var + 0」創建一個新對象?
var1 = 10
puts var1.object_id
var1 = var1 + 0
puts var1.object_id
var1 = var1 + 1
puts var1.object_id
輸出是:
1> 21
2> 21
3> 23
問:爲什麼紅寶石添加非零值,但不加0的時候,當創建一個新的對象?
我有這樣的Ruby代碼:爲什麼Ruby爲「var = var + 1」而不是「var = var + 0」創建一個新對象?
var1 = 10
puts var1.object_id
var1 = var1 + 0
puts var1.object_id
var1 = var1 + 1
puts var1.object_id
輸出是:
1> 21
2> 21
3> 23
問:爲什麼紅寶石添加非零值,但不加0的時候,當創建一個新的對象?
內部Ruby¹不創建對象在所有與Fixnums。相反,實現使用「標記」指針,即如果設置了指針的最低有效位,Ruby明白這個指針實際上並不指向一個對象,而是直接編碼Fixnum的值。因此具有相同數值的Fixnum將始終由相同的指針值表示。
¹我的意思是官方的Ruby解釋器 - 其他的實現可能會以不同的方式處理。
它沒有。 10
和11
是Fixnums。正弦每個整數值只有一個Fixnum實例,10
有一個object_id,而11
有一個object_id。這就是你所看到的。
紅寶石已經predifined對象
irb(main):001:0> 10.object_id
=> 21
irb(main):002:0> 11.object_id
=> 23
這是一些自然數,更
irb(main):003:0> true.object_id
=> 2
irb(main):004:0> false.object_id
=> 0
irb(main):005:0> nil.object_id
=> 4
irb(main):006:0> 0.object_id
=> 1
irb(main):007:0> -2.object_id
=> -3
和工作時,這些ID不會改變
在Ruby,Fixnum
S,true,
false
,nil
和Symbol
■找預定義object_id
秒。
1.object_id #=> 3
2.object_id #=> 5
添加0
到一個小的整數不改變它的值,因此其object_id
保持相同。
但是,如果您在Bignum
上運行相同的算術,您將得到不同的object_id
s。
a = 1073741824
puts a.object_id # => 7658076
b = a + 0
puts b # => 1073741824
puts b.object_id # => 7287012
常量並不一定意味着相同的值始終具有相同的'object_id'。浮游物和Bignum也是不變的,他們不像那樣。說到Bignums:這種行爲適用於Fixnums,而不是所有的整數。 – sepp2k