class MyClass < BasicObject
class Error < ::NoMethodError
def method_missing(....)
raise Error
end
end
end
p MyClass.superclass # => BasicObject
p method(:raise).owner # => Kernel
現在、クラスKernel
の先祖チェーンには存在しません。MyClass
したがってraise
、メソッド内で呼び出すと、method_missing
メソッドが再び呼び出されますmethod_missing
(raise
はクラスのメソッドではMyClass
なく、所有者もKernel
混在してMyclass
いるため、raise
メソッドの検索に失敗し、 を繰り返し呼び出しますmethod_missing
。したがって、 としてエラーが発生しSystemStackError: stack level too deep
ます。私はここで、あなたが直面しているシナリオを以下のように再現しようとしました:
class Foo < BasicObject
def method_missing(name,*args)
p "hi"
end
end
Foo.new.baz
# stack level too deep (SystemStackError)
ここでも理由は同じFoo#baz
ですmethod_missing
。の中method_missing
で、クラスのメソッドである別のメソッドを呼び出そうとしていますKernel
。今Kernel
はどちらBasicObject
にも混ざっていませんFoo
。そのため、メソッドの検索に失敗しmethod_missing
、メソッドの呼び出しのために繰り返し呼び出されKernel#p
、エラーが発生します。これを修正するには、次のようにします。
class Foo < BasicObject
include ::Kernel
def method_missing(name,*args)
p "hi"
end
end
Foo.new.baz # => "hi"
あなたが今要点を得たことを願っています。