Вызов функции из строки с именем функции в Ruby

Как я могу сделать то, что они говорят о здесь, но в 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 не ленитесь и на самом деле напечатайте весь свой вопрос, вместо того, чтобы ссылаться на что-то.