为什么无法在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>'
答案 0 :(得分:6)
答案 1 :(得分:0)
答案 2 :(得分:0)
Singleton
class的定义功能是:它只有一个实例。
FalseClass
只有一个实例:false
。TrueClass
只有一个实例:true
。NilClass
只有一个实例:nil
。这与不一样,例如,Float
和Symbol
类;这些不是单身人士。
虽然对于给定的值,这些类只有一个实例:
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
和:bar
是Symbol
的两个不同的实例。
这就是为什么可以在singleton
,TrueClass
和FlaseClass
上定义NilClass
方法,但不能在Symbol
上定义。