Betrachten Sie den folgenden Code ein:Warum findet Ruby keine Konstanten, die in der Klasse des Aufrufers definiert sind?
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
Die beiden hier Instanzmethoden verhalten sich anders:
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
Die Version, die in der Unterklasse auf ein Verfahren bezieht sich der gewünschte Wert zurückgegeben, aber die Version, die sich bezieht Eine Konstante in der Unterklasse löst einen Fehler aus. Das Rätsel ist also: Warum funktioniert die Version, die eine Methode verwendet, aber die Version, die die Konstante verwendet, fehlschlägt?
Dies ist ein unverständliches Design für mich. In OOP würde ich niemals erwarten, dass ich nach etwas Ausschau halten kann, das in einer Kindklasse definiert ist, außer (und mein Verständnis ist eine Debatte über den Wert davon) eine Methode, deren Verhalten außer Kraft gesetzt wird. Sicherlich sollten Sie niemals erwarten, dass etwas, das nur in einer Unterklasse definiert ist, für seine Eltern sichtbar ist. –
Von mir: Version, die Methode verwendet - Aufrufe Konstante im Bereich der Klasse 'SubClass', so ist es Arbeit, in einem anderen Sie' FOO_CONSTANT' aufrufen und versuchen, diese Konstante im Bereich von 'MyClass' zu finden, um es praktikabel zu machen: nur schreibe 'SubClass :: FOO_CONSTANT' –