2012-12-19 4 views
25

インスタンスにシングルトンメソッドを定義できないRubyクラスがいくつかあります。たとえば、SymbolシングルトンメソッドをSymbolまたはFixnumで定義できないのはなぜですか?

var = :asymbol 

def var.hello 
    "hello" 
end 

# TypeError: can't define singleton method "hello" for Symbol 

は、私は、これはすべての即値上の制限かもしれないと思ったが、それはniltrue、およびfalseFixnumまたはBignumのではなく、インスタンス)のために働くようだ:

var = true 

def var.hello 
    "hello" 
end 

var.hello #=> "hello" 

Rubyが特定のクラスのオブジェクトに対してシングルトンメソッドを定義できる理由を理解できません。

+0

「Fixnum」だけでなく、「Numeric」であるようです。 –

+0

私の嫌な反応は、文脈にかかわらず同じ値になるタイプのものがあるということです。シンボル ':fred'は常に' 5'と同じシンボルオブジェクトになります。残念なことに、同じことは真の場合にも当てはまります。それよりも深いところです。私はまずそれがバージョン間で同じかどうか疑問に思います。そして、それぞれのタイプの不変性がどのように実装されたのか疑問に思います。 –

+0

[Object#singleton_class](http://ruby-doc.org/core-2.3.0/Object.html#method-i-singleton_class)のドキュメントでは、「[receiver] 'obj'が' nil'ならば'True'または' FalseClass'を返し、 'obj'が' Fixnum'または 'Symbol'の場合は' TypeError'を送出します。しかし、@Andrewが指摘するように、数値はシングルトンクラスを持つことはできません。 'nil'、' true'、 'false'はシングルトンクラス(例えば' class << false; puts self; end#=> FalseClass')を持っていますが、これらのクラスは一つのインスタンスしか持たないので、クラスとシングルトンクラスです。 –

答えて

20

これは、Matz社のhereと記載されているように、「即値」と呼ばれる概念と関係しています。

実際には、即値でシングルトンメソッドを許可する必要はありません。しかし、true,falsenilの場合、実際にはこれらの値を返すシングルトンクラスがあります(または値は実際にシングルトンクラスです - これについてはわかりません)。したがって、値そのものであるかのように明示的にバッキングクラスにシングルトンインスタンスを追加することができます。数値インスタンスとシンボルインスタンスはシングルトンではなく(明らかに)、シングルトンメソッドを保持する場所はありません。

+0

Hmm、 'true'、' false'、 'nil'は実際には直接の値ではありません。あなたはそれについての参考文献を持っていますか? –

+1

彼らは[実際には即時の値です](http://www.ruby-doc.org/core-1.9.3/ObjectSpace.html#each_object-method)と思われます。実際の相違点は上記のとおりです。更新を参照してください。 – PinnyM

関連する問題