我在Fixnum中找到了文档的以下特性。
Fixnum对象具有即时值。这意味着当它们作为参数分配或传递时,将传递实际的对象,而不是对该对象的引用。
在IRB中可以显示相同的内容吗?希望只有它才能被我正确理解?
赋值不别名Fixnum对象。
那究竟是什么呢?
对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能向
Fixnum添加单例方法。
无法理解不使用singleton对象实例添加Fixnum方法的原因。
我对第二点作了一些尝试,具体如下:
a = 1 # => 1
a.class # => Fixnum
b = a # => 1
b.class # => Fixnum
a == b # => true
a.equal? b # => true
a.object_id == b.object_id # => true但我还是很困惑。有谁能帮我了解一下这些功能的核心吗?
发布于 2013-03-07 01:15:30
在Ruby中,大多数对象需要内存来存储它们的类和实例变量。一旦分配了这个内存,Ruby就会根据这个内存位置来表示每个对象。当对象被分配给一个变量或传递给一个函数时,传递的是这个内存的位置,而不是这个内存中的数据。Singleton方法利用了这一点。当您定义单例方法时,Ruby悄悄地用一个新的单例类替换对象类。因为每个对象都存储其类,Ruby可以轻松地用一个实现单例方法(并从原始类继承)的新类替换对象的类。
对于直接值的对象,这不再是正确的:true、false、nil、所有符号以及足够小到适合于Fixnum的整数。Ruby不为这些对象的实例分配内存,也不将对象内部表示为内存中的位置。相反,它根据对象的内部表示来推断对象的实例。这意味着有两个方面:
要更好地理解这一点,请考虑在Fixnum上执行以下操作:
>> x = 3 + 7
=> 10
>> x.object_id == 10.object_id
=> true
>> x.object_id == (15-5).object_id
=> true现在,考虑使用字符串:
>> x = "a" + "b"
=> "ab"
>> x.object_id == "ab".object_id
=> false
>> x.object_id == "Xab"[1...3].object_id
=> false
>> x == "ab"
=> true
>> x == "Xab"[1...3]
=> trueFixnum的对象ids相等的原因是它们是具有相同内部表示的直接对象。另一方面,字符串存在于已分配的内存中。每个字符串的对象id是其对象状态在内存中的位置。
一些低级信息
要理解这一点,您必须了解Ruby (至少1.8和1.9)如何在内部处理Fixnum。在Ruby中,所有对象都用VALUE类型的变量在C代码中表示。Ruby对VALUE提出了以下要求
sizeof(VALUE) == sizeof(void*)。4*i,用于某些整数i。这也意味着所有指针的两个最不重要位的值都为零。第一个需求允许Ruby将指向对象的指针和直接值存储在VALUE类型的变量中。第二个需求允许Ruby基于两个最不重要的位来检测Fixnum和符号对象。
为了使这更具体,请考虑Ruby对象z的内部二进制表示,我们将在32位体系结构中将其称为Rz:
MSB LSB
3 2 1
1098 7654 3210 9876 5432 1098 7654 32 10
XXXX XXXX XXXX XXXX XXXX XXXX XXXX AB CD然后,Ruby将Rz ( z的表示形式)解释为:
D==1,那么z就是Fixnum。此Fixnum的整数值存储在表示的上31位中,并通过执行算术右移来恢复存储在这些位中的有符号整数。D==0)- if `Rz==0`, then `z` is `false`
- if `Rz==2`, then `z` is `true`
- if `Rz==4`, then `z` is `nil`
ABCD == 1110,那么z就是一个符号。通过右移八个最不重要的位(即C中的z>>8 ),符号被转换成唯一的ID。在32位架构上,这允许2^24个不同的ID(超过1,000万).在64位架构上,这允许2^48个不同的ID.Rz表示Ruby对象实例在内存中的地址,z的类型由该位置的类信息决定。发布于 2013-03-06 14:52:20
好吧..。
VALUE。在大多数情况下,VALUE是指向存在于堆栈上的对象的指针。但是即时值(Fixnum、true、false、nil等)存在于VALUE中,指向对象的指针通常在其中存在。VALUE本身,但它确实这样做了。1时,我都使用相同的对象。因此,如果我在1上定义了一个单例方法,那么我的程序中的每一个地方,所需的程序等等,都会有这个单例方法。单例方法通常用于局部猴子识别。所以,为了防止这种情况,Ruby只是不让你。https://stackoverflow.com/questions/15250212
复制相似问题