Имеет ли Ruby эквивалент method_missing для переменных экземпляра undefined?
Когда я вызываю метод, который не существует, method_missing
сообщит мне имя метода. Когда я пытаюсь получить доступ к переменной, которая не была установлена, значение просто nil
.
Я пытаюсь динамически перехватить доступ к переменным экземпляра nil и возвращать значение, основанное на имени переменной, к которой обращаются. Ближайшим эквивалентом будет PHP __get
. Есть ли в Ruby эквивалентная функциональность?
Ответы
Ответ 1
Я не считаю, что это возможно в Ruby. Рекомендуемым способом было бы использовать метод '' user '', а не экземпляр '' @user '' var в ваших шаблонах.
Это согласуется с тем, как вы работаете с объектами Ruby извне ('' obj.user '' - это метод, который ссылается на "@user", но на самом деле он не сам "@user" ). Если вам нужна какая-то специальная логика с атрибутом, лучше всего использовать метод (или method_missing), независимо от того, обращаетесь к нему изнутри или снаружи объекта.
Ответ 2
См. мой ответ на другой подобный вопрос. Но только потому, что вы можете это сделать, это не значит, что это хорошая идея. Разумная конструкция может в целом преодолеть потребность в подобных вещах и позволить вам создавать более читаемый и, следовательно, поддерживаемый код.
instance_variable_get
кажется самым близким эквивалентом PHP __get
из того, что я вижу (хотя я не являюсь пользователем PHP).
Глядя на соответствующий исходный код Ruby, единственным "отсутствующим" методом для переменных является const_missing
для констант, ничего для переменных экземпляра.
Ответ 3
нет экземпляра_variable_missing (по крайней мере, я знаю)
Но почему вы так или иначе получаете доступ к случайным именам переменных экземпляра?
Если в вашем потоке весь доступ к состоянию объекта через вызов метода (как и следовало бы в любом случае), вам это не понадобится.
Если вы ищете способ определить магический материал, не вникая в поиск метода, вы можете использовать const_missing
.