考慮下面的代碼:爲什麼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
兩個實例此方法的行爲是不同的:
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' –