vieweditattachhistoryswikistopchangessearchhelp

特異メソッド

Ruby におけるインスタンス特異的なメソッド(instance-specific method)のこと。singleton method、singular method などと英訳され呼称されることもあるが、日本語の特異メソッドを含めいずれも一般的ではない、Ruby 独自の用語。デザインパターンの Singleton 関連のメソッドと混同されがちだが両者は(まったく…というわけではないが)あまり関係ない。

Ruby 設計者、まつもと氏による直接の言及はないが、一連の発言から、おそらくは、CLOS総称関数における EQL スペシャライザ(引数のクラスを指定する代わりに、指定の書式により特定のインスタンスに限定できる)をヒントに Ruby に組み込まれた機能。ただエンドユーザーがイメージする動作モデルとしては、この EQL スペシャライザより SELF などインスタンスベース言語におけるメソッドの扱い、つまり、属するクラス(もしくはトレイト)ではなく、インスタンスそれ自身が自分専用のメソッドを持ったり、それを起動する様子のほうがより似ている。自ら言語学者を称する まつもと氏は、当然、SELF もかじっているはずなのに、この特異メソッドの発想が SELF ではなく CLOS からの影響だとする理由は不明。--sumim

Ruby にはメタクラスがあり、クラスはそのインスタンスという扱いになっているにもかかわらず、Ruby のクラスメソッド(すなわちオブジェクトとしてのクラスがメッセージを受信して起動することができるメソッド)は、あえて、この特異メソッドで実現されているため扱いに注意を要する。--sumim


特異メソッドの例

foo=Object.new
def foo.a
  "foo.a"
end

p foo.a # => "foo.a"

--sumim

クラスメソッドは「クラスの特異メソッド」だ、の例

class Foo
  def Foo.foo
    "Foo.foo"
  end
  def self.bar  ## 余談だが、この文脈ではself==class Fooなので、こういう書き方も出来ます。
    "self.bar"
  end
end
p Foo.foo # => "Foo.foo"
p Foo.bar # => "self.bar"

--unknown(airh128)



Squeak の Smalltalk では、#assureUniClass を使ってそのインスタンス専用の新しいクラス(Ruby でいうところの特異クラス相当)をつくってやり、そこにメソッドを定義することで、Ruby の特異メソッドと似たようなしくみでその挙動をシミュレートできる。--sumim

参考:



Python には同種の言語機能はないが、インスタンス生成時に使用するクラスのスロットを動的に変更することで、これ近い効果を得ることはできるようである。
--sumim

このページを編集 (2441 bytes)


Congratulations! 以下の 8 ページから参照されています。

This page has been visited 8029 times.