2009-03-19 23 views

Trả lời

1

tốt, nó phụ thuộc vào ý bạn là "ruby";) Trong jruby nó chỉ là một số nguyên duy nhất theo như tôi có thể nói.

Ngoài ra, những thứ như số không phải là vị trí bộ nhớ. Tôi quên tất cả các chi tiết và chắc chắn ai đó sẽ cung cấp cho họ cho bạn.

irb(main):020:0> 1.object_id 
=> 3 
irb(main):021:0> (2-1).object_id 
=> 3 
+1

Fixnum được lưu trữ trong các bit object_id chuyển sang bên trái và với bộ bit ít quan trọng nhất, hãy xem http://stackoverflow.com/questions/2402228/accessing-objects-memory-address-in-ruby/2402440#2402440 '(2-1)' của bạn không có ý nghĩa, hãy thử thay vào đó là '(4711 >> 1) .object_id' –

1

Trong ruby ​​"bình thường" (MRI 1.8.x và 1.9.x), nó chỉ là giá trị duy nhất.

Đây cũng là trường hợp trong IronRuby

6

Đó là sự kết hợp của nhiều thông số, giá trị, loại đối tượng, vị trí trong bộ nhớ.
Có thể đọc thêm here

4

Đây không phải là tham chiếu trực tiếp đến vị trí bộ nhớ và "mã hóa" cụ thể đối với triển khai Ruby cụ thể. Nếu bạn có thể đọc mã C, bạn có thể thấy nó có tính hướng dẫn để xem các phương thức rb_obj_idid2ref trong gc.c trong nguồn Ruby 1.8.6. Bạn cũng có thể đọc thêm về "mã hóa" trong phần "Đối tượng được nhúng trong VALUE" của bản dịch từng phần của Ruby Hacking Guide chapter 2.

+0

[Liên kết tới nguồn MRI.] (http: // rxr. whitequark.org/mri/source/gc.c#3158) –

3

Nó đáng chú ý là bạn có thể thực hiện một đảo ngược tra cứu của ID đối tượng sử dụng:

ObjectSpace._id2ref(object_id) 

Ví dụ:

ObjectSpace._id2ref(0) #=> false 
ObjectSpace._id2ref(1) #=> 0 
ObjectSpace._id2ref(2) #=> true 
ObjectSpace._id2ref(3) #=> 1 
ObjectSpace._id2ref(4) #=> nil 
Các vấn đề liên quan