インスタンスにシングルトンメソッドを定義できないRubyクラスがいくつかあります。たとえば、Symbol
:シングルトンメソッドをSymbolまたはFixnumで定義できないのはなぜですか?
var = :asymbol
def var.hello
"hello"
end
# TypeError: can't define singleton method "hello" for Symbol
は、私は、これはすべての即値上の制限かもしれないと思ったが、それはnil
、true
、およびfalse
(Fixnum
またはBignum
のではなく、インスタンス)のために働くようだ:
var = true
def var.hello
"hello"
end
var.hello #=> "hello"
Rubyが特定のクラスのオブジェクトに対してシングルトンメソッドを定義できる理由を理解できません。
「Fixnum」だけでなく、「Numeric」であるようです。 –
私の嫌な反応は、文脈にかかわらず同じ値になるタイプのものがあるということです。シンボル ':fred'は常に' 5'と同じシンボルオブジェクトになります。残念なことに、同じことは真の場合にも当てはまります。それよりも深いところです。私はまずそれがバージョン間で同じかどうか疑問に思います。そして、それぞれのタイプの不変性がどのように実装されたのか疑問に思います。 –
[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')を持っていますが、これらのクラスは一つのインスタンスしか持たないので、クラスとシングルトンクラスです。 –