Имеет ли 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.