は、以下のコードを検討:なぜRubyは呼び出し元のクラスで定義された定数を見つけることができませんか?
class MyClass
def foo_via_method
foo_method
end
def foo_via_constant
FOO_CONSTANT
end
end
class SubClass < MyClass
FOO_CONSTANT = "foo"
def foo_method
FOO_CONSTANT
end
end
ここでは、2つのインスタンスメソッドは、異なる動作:
sub_class_instance = SubClass.new
### THIS WORKS ###
sub_class_instance.foo_via_method
# => "foo"
### THIS DOESN'T ###
sub_class_instance.foo_via_constant
# NameError: uninitialized constant MyClass::FOO_CONSTANT
サブクラス方法を指すバージョンが所望の値を返し、それだけに意味バージョンサブクラスの定数がエラーをスローします。パズルはこれです:メソッドを使用するバージョンは動作しますが、定数を使用するバージョンは失敗します。
これはわかりにくいデザインです。 OOPでは、子クラスで定義された何かを探すことはできません(そして、私の理解はこれの価値について議論されています)。振る舞いがオーバーライドされたメソッドです。確かに、サブクラスでのみ定義された何かがその親に見えることを決して期待するべきではありません。 –
私から:メソッドを使用するバージョン - クラス 'SubClass'のスコープ内で定数を呼び出すので、他の関数では' FOO_CONSTANT'を呼び出し、 'MyClass'のスコープ内でこの定数を見つけようとしています。 'SubClass :: FOO_CONSTANT'と書いてください。 –