2013-03-14 2 views
2

Почему singleton методы не могут быть определены на Fixnum, Bignum, Float, Symbol объекты класса, но FalseClass и TrueClass может иметь?Почему методы `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

Не имеете в виду «объекты экземпляра», а не «объекты класса»?BTW, объект экземпляра 'NilClass' также позволяет использовать одноэлементные объекты. –

ответ

0

Из docs:

Существует эффективно только один Fixnum экземпляр объекта для любого заданного целого значения, так, например, вы не можете добавить метод одноплодной к Fixnum.

Это относится к другим примитивным числовым типам и символу.

5

Как Ruby Docs говорят:

Существует эффективно только один Fixnum экземпляра объекта для любого заданного целого значения, так, например, вы не можете добавить одноплодный метод к Fixnum.

То же самое верно и для Bignum, Float и Symbol

+2

Но почему не для 'false',' true' или 'nil'? –

+0

Это совершенно неверно: 'big_fix = 4611686018427387903; big_fix.class # => Fixnum; big1 = big_fix + 1; big1.class # => Bignum; big2 = big_fix + 1; big1.object_id == big2.object_id # => false', поэтому может быть ** много ** Bignums с одинаковым значением, но с разными ссылками. – YoTengoUnLCD

0

Определяющей особенностью является Singleton class: Она имеет только один экземпляр .

  • Имеются только один экземпляр FalseClass: false.
  • Имеется только один экземпляр TrueClass: true.
  • Существует только один экземпляр NilClass: nil.

Это не то же самое как, например, в Float и Symbol классов; это не Singletons.

Хотя это правда, что есть только один экземпляр этих классов при заданном значении:

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.