Как я могу сделать то, что они говорят о здесь, но в 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()
UPDATE:
Как вы относитесь к глобальным методам? или мои глобальные функции?
Я пробовал эту дополнительную строку
puts methods
и load и row_change, если они не указаны.
Ответ 1
Для вызова функций непосредственно на объект
a = [2, 2, 3]
a.send("length")
который возвращает 3, как ожидалось
или для функции модуля
FileUtils.send('pwd')
и локально определенный метод
def load()
puts "load() function was executed."
end
send('load')
Ответ 2
Используйте это:
> a = "my_string"
> meth = a.method("size")
> meth.call() # call the size method
=> 9
Просто, правильно?
Что касается глобального, я думаю, что Ruby-метод будет искать его с помощью метода methods
.
Ответ 3
Три способа: send
/call
/eval
- и их контрольные показатели
Типичный вызов (для справки):
s= "hi man"
s.length #=> 6
Использование send
s.send(:length) #=> 6
Использование call
method_object = s.method(:length)
p method_object.call #=> 6
Использование eval
eval "s.length" #=> 6
Бенчмарки
require "benchmark"
test = "hi man"
m = test.method(:length)
n = 100000
Benchmark.bmbm {|x|
x.report("call") { n.times { m.call } }
x.report("send") { n.times { test.send(:length) } }
x.report("eval") { n.times { eval "test.length" } }
}
... как вы можете видеть, создание экземпляра объекта метода является самым быстрым динамическим способом вызова метода, а также заметьте, насколько медленным является использование eval.
#######################################
##### The results
#######################################
#Rehearsal ----------------------------------------
#call 0.050000 0.020000 0.070000 ( 0.077915)
#send 0.080000 0.000000 0.080000 ( 0.086071)
#eval 0.360000 0.040000 0.400000 ( 0.405647)
#------------------------------- total: 0.550000sec
# user system total real
#call 0.050000 0.020000 0.070000 ( 0.072041)
#send 0.070000 0.000000 0.070000 ( 0.077674)
#eval 0.370000 0.020000 0.390000 ( 0.399442)
Кредит относится к этому сообщению , которое более подробно описывает три метода, а также показывает, как проверить, существуют ли методы.
Ответ 4
Лично я хотел бы настроить хеш для работы ссылок, а затем использовать строку в качестве индекса для хэша. Затем вы вызываете ссылку на функцию с ее параметрами. Это имеет то преимущество, что не позволяет неправильной строке вызывать то, что вы не хотите вызывать. Другим способом является в основном eval
строка. Не делайте этого.
PS не ленитесь и на самом деле напечатайте весь свой вопрос, вместо того, чтобы ссылаться на что-то.