为什么`singleton`方法不能在`Fixnum`,`Bignum`,`Float`,`Symbol`类对象上定义,但``FalseClass`和`TrueClass`可以有?

时间:2013-03-14 19:34:46

标签: ruby ruby-2.0

为什么无法在singletonFixnumBignumFloat类对象上定义Symbol方法,但FalseClassTrueClass可以有吗?

C:\>ruby -v
ruby 2.0.0p0 (2013-02-24) [i386-mingw32]

C:\>irb --simple-prompt
DL is deprecated, please use Fiddle
11111111111.class
#=> Bignum
class << 11111111111 ; end
#TypeError: can't define singleton
#        from (irb):2
#        from C:/Ruby200/bin/irb:12:in `<main>'

1111.class
#=> Fixnum
class << 1111 ; end
#TypeError: can't define singleton
#       from (irb):4
#       from C:/Ruby200/bin/irb:12:in `<main>'

11.11.class
#=> Float
class << 11.11 ; end
#TypeError: can't define singleton
#       from (irb):6
#       from C:/Ruby200/bin/irb:12:in `<main>'

:name.class
#=> Symbol
class << :name ; end
#TypeError: can't define singleton
#       from (irb):8
#       from C:/Ruby200/bin/irb:12:in `<main>'

3 个答案:

答案 0 :(得分:6)

正如Ruby Docs所说:

  

对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单例方法添加到Fixnum。

BignumFloatSymbol

也是如此

答案 1 :(得分:0)

来自docs

对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单例方法添加到Fixnum。

这适用于其他原始数字类型和符号。

答案 2 :(得分:0)

Singleton class的定义功能是:它只有一个实例

  • FalseClass只有一个实例:false
  • TrueClass只有一个实例:true
  • NilClass只有一个实例:nil

这与不一样,例如,FloatSymbol类;这些不是单身人士。

虽然对于给定的值,这些类只有一个实例

3.14159.object_id #=> 20565057194439538
3.14159.object_id #=> 20565057194439538
3.14159.object_id #=> 20565057194439538
:hello.object_id  #=> 3551708
:hello.object_id  #=> 3551708
:hello.object_id  #=> 3551708

例如,与不具有此属性的String类不同:

"test".object_id #=> 34347120
"test".object_id #=> 34388680
"test".object_id #=> 22397760

请记住,不是 Singleton的定义。 :foo:barSymbol的两个不同的实例。

这就是为什么可以在singletonTrueClassFlaseClass上定义NilClass方法,但不能在Symbol上定义。