4

、、、クラス オブジェクトではsingletonメソッドを定義できないのに、およびを持つことができるのはなぜですか?FixnumBignumFloatSymbolFalseClassTrueClass

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 Docsが言うように:

任意の整数値に対して事実上1つのFixnumオブジェクトインスタンスしかないため、たとえば、Fixnumにシングルトンメソッドを追加することはできません。

Bignum同じことが、、Floatおよびにも当てはまります。Symbol

于 2013-03-14T19:56:46.057 に答える
1

ドキュメントから:

任意の整数値に対して事実上1つのFixnumオブジェクトインスタンスしかないため、たとえば、Fixnumにシングルトンメソッドを追加することはできません。

これは、他のプリミティブ数値タイプとシンボルにも当てはまります。

于 2013-03-14T19:56:30.893 に答える
1

Singletonクラスの定義機能は次のとおりです。インスタンスは 1 つしかありません。

  • FalseClass:のインスタンスは 1 つだけですfalse
  • TrueClass:のインスタンスは 1 つだけですtrue
  • NilClass:のインスタンスは 1 つだけですnil

これは、たとえばandクラスと同じではありません。これらはシングルトンではありません。FloatSymbol

特定の値に対してこれらのクラスのインスタンスが 1 つしかないことは事実です。

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は の 2 つの異なるインスタンスですSymbol

これが、singletonメソッドを on で定義できる理由ですが、たとえば onでは定義TrueClassできません。FlaseClassNilClassSymbol

于 2017-01-03T09:53:02.090 に答える