4

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

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>'
4

3 回答 3

7

正如Ruby 文档所说:

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

对于Bignum,FloatSymbol

于 2013-03-14T19:56:46.057 回答
1

文档

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

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

于 2013-03-14T19:56:30.893 回答
1

Singleton一个类的定义特征是:它只有一个实例

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

例如FloatandSymbol类不同;这些不是单身人士。

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

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

请记住,这不是单例的定义。:foo并且:bar是 的两个不同实例Symbol

这就是为什么singleton可以在 上定义方法,TrueClass但不能在例如 上定义的原因。FlaseClassNilClassSymbol

于 2017-01-03T09:53:02.090 回答