Как я могу сделать то, о чем они говорят здесь , но в Ruby?
Как бы вы сделали функцию на объекте? и как бы вы сделали глобальную функцию (см. ответ Jetxee на упомянутый пост)?
ПРИМЕР КОДА:
event_name = "load"
def load()
puts "load() function was executed."
end
def row_changed()
puts "row_changed() function was executed."
end
#something here to see that event_name = "load" and run load()
ОБНОВЛЕНИЕ: Как вы получаете глобальные методы? или мои глобальные функции?
Я пробовал эту дополнительную строчку
puts methods
и загрузить и row_change, где нет в списке.
ruby
metaprogramming
BuddyJoe
источник
источник
Три пути:
send
/call
/eval
- и их контрольные показателиТипичный вызов (для справки):
С помощью
send
С помощью
call
С помощью
eval
Ориентиры
Авторы этой статьи пишут в блоге, в которой более подробно рассматриваются три метода, а также показано, как проверить, существуют ли эти методы.
источник
Class.send("classVariable") = 5
? Это выдает ошибку. Есть ли способ обойти это? То же самое верно для использованияClass.method("classVariable").call() = 5
call
включить создание экземпляра метода object (m.test.method(:length)
) для точного представления его истинного времени? При использованииcall
вы, вероятно, будете каждый раз создавать экземпляр объекта метода.Использовать это:
Просто, правда?
Что касается глобального , я думаю, что Ruby мог бы найти его, используя
methods
метод.источник
"my_string".method('blah') #=> NameError: undefined method
бла 'для классаString'
Лично я бы настроил хеш для ссылок на функции, а затем использовал бы строку как индекс для хеша. Затем вы вызываете ссылку на функцию с ее параметрами. Это имеет то преимущество, что не позволяет неправильной строке вызывать то, что вы не хотите вызывать. Другой способ заключается в основном
eval
в строке. Не делай этого.PS Не ленитесь и напишите весь вопрос, вместо того, чтобы ссылаться на что-то.
источник