Ruby 带有Fixnum和Symbol的mutator方法

Ruby 带有Fixnum和Symbol的mutator方法,ruby,Ruby,在matz的书《Ruby编程语言》中,他说: 我们说过Ruby中的所有值都是对象,所有对象都是对象 通过引用操纵。然而,在参考实施中, Fixnum和Symbol对象实际上是“立即值”,而不是 参考资料。这两个类都没有mutator方法,所以Fixnum 符号对象是不可变的…唯一实际的区别 即时值和参考值之间的关系是即时值 不能在其上定义单例方法 所以我启动了irb并测试了这个声明 class Symbol def self.mutator puts 'mutator method'

在matz的书《Ruby编程语言》中,他说:

我们说过Ruby中的所有值都是对象,所有对象都是对象 通过引用操纵。然而,在参考实施中, Fixnum和Symbol对象实际上是“立即值”,而不是 参考资料。这两个类都没有mutator方法,所以Fixnum 符号对象是不可变的…唯一实际的区别 即时值和参考值之间的关系是即时值 不能在其上定义单例方法

所以我启动了irb并测试了这个声明

class Symbol
  def self.mutator
    puts 'mutator method'
  end
end

Symbol.mutator
# => mutator method
我刚刚在Symbol上定义了一个单例方法,没有错误。他在说什么

[…]立即数值不能定义单例方法

Singleton方法是您在类实例的对象上定义的方法,而不是在类(对象)本身上定义的方法,如您提供的示例中所示

考虑以下代码:

s = :sym

def s.my_method
  puts "HELLO"
end
# => TypeError: can't define singleton
当在其他对象上时,例如
字符串

str = "string"

def str.my_method
  puts "HELLO"
end

str.my_method
# => HELLO
第二个是没有任何错误

希望有帮助

更新-什么是即时值

Fixnum是包含立即值的对象

这意味着什么?这意味着如果我们写x=5,数字5将 直接存储(编码)到变量x中,就像它是一个 原始数据类型(对于ruby传统对象,x将具有 包含与堆中存储的对象对应的地址)。 所以,当我们写x=5时,x知道它需要的关于这个数的一切 5.事实上,x是对象,而不是对它的引用

让我们考虑一个例子:

fix1 = 2
fix2 = 2

fix1.object_id
# => 5

fix2.object_id
# => 5
但是:

相同值的
Fixnum
s具有完全相同的
object\u id
(这同样适用于
Symbol
),但对于
String
s,即使它们具有相似的值
“test”
,它们也具有不同的
object\u id
s


因为立即值是不可变的(在内存中分配相同的位置),所以它们不能是可变的。

@Mohamad我理解,但是你读过上面的引文了吗?这句话不是在说作业。这是关于单例方法。他说单例方法不能定义在即时对象上,
Symbol
不是即时对象。我不清楚的是“即时值”的定义。
str1 = "test"
str2 = "test"

str1.object_id
# => 2157416420

str2.object_id
# => 2157531060