27

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

var = :asymbol

def var.hello
  "hello"
end

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

これはすべての即時値に対する制限であると考えましたがnil、 、true、およびfalseFixnum(またはのインスタンスではなくBignum) で機能するようです。

var = true

def var.hello
  "hello"
end

var.hello #=> "hello"

なぜRubyがオブジェクトの特定のクラスでシングルトンメソッドを定義できるのに、他のクラスでは定義できないのか理解できません。

4

1 に答える 1

20

これは、ここで Matz によって説明されている「即時値」と呼ばれる概念と関係があります。

実際には、単一のメソッドを許可する即値はありません。ただし、truefalse、およびの場合、nil実際にはこれらの値をサポートするシングルトン クラスがあります (または、値は実際にはシングルトン クラスです。これについてはよくわかりません)。したがって、値そのものであるかのように現れるバッキング クラスにシングルトン インスタンスを追加できます。Numeric および Symbol インスタンスは (明らかに) シングルトンではなく、シングルトン メソッドを保持する場所がありません。

于 2012-12-19T22:39:53.343 に答える