クラスメソッドから擬似的にインスタンスメソッドを呼ぶ
メモ
Class Foo def self.foo bar end def bar 'bar' end end Foo.foo #=> NameError : undefined local variable or method `bar` for Foo:Class
などとクラスメソッドから同クラスのインスタンスメソッドを呼ぶと怒られるが
Class Foo def self.foo f = Foo.new f.bar end def bar 'bar' end end Foo.foo #=> 'bar'
というようにインスタンスメソッドのレシーバをself以外にすると呼べる。
まるでプライベートメソッドを子クラスから呼ぶときのようだ。
それにしても、クラスメソッドから自クラスのインスタンスメソッドはレシーバがselfの場合呼べないのにクラスメソッドから自クラスのインスタンス変数にはアクセスできるのが摩訶不思議。
このインスタンス変数は何のインスタンスの変数なのか?
class Foo attr :f def foo @f = 'foo' end end Foo.foo #=> 'foo'
訂正:失礼しました。上記のプライベートメソッドを子クラスから呼ぶときのようだというのは誤りです。プライベートメソッドを子クラスから呼ぶ際はレシーバはselfです。self以外は呼び出せないのがプライベートメソッドですので丁度クラスメソッドから自クラスのインスタンスメソッドを呼ぶ時の反対です。