#ruby #methods
#ruby #методы
Вопрос:
У меня есть два метода, определенные в моем файле ruby.
def is_mandatory(string)
puts xyz
end
def is_alphabets(string)
puts abc
end
Массив, содержащий имена методов.
methods = ["is_mandatory", "is_alphabets"]
Когда я делаю следующее
methods.each do |method| puts method.concat("("abc")") end
Он просто отображает, is_mandatory(«abc») is_alphabets(«abc») вместо фактического вызова метода.
Как я могу преобразовать строку в имя метода? Любая помощь приветствуется.
Приветствия!!
Комментарии:
1. Кстати, в Ruby для выполнения методов is_* используется вопросительный знак, а не префикс «is», т.е.
mandatory?
иalphabets?
.
Ответ №1:
Вероятно, лучший способ:
methods.each { |methodName| send(methodName, 'abc') }
Смотрите объект#отправить
Комментарии:
1. Принадлежат ли эти методы какому-либо классу?
2. Тогда вы хотите что-то вроде:
obj = OwningClass.new; methods.each { |meth| obj.send(meth, 'abc') }
3. или, если мы говорим о методах класса, тогда
methods.each{ |method| Class.send(meth, argument) }
Ответ №2:
Попробуйте использовать «отправить».
methods.each do |method|
self.send(method, "abc")
end
Ответ №3:
Все предыдущие решения с send
хороши, но вместо этого рекомендуется использовать public_send (в противном случае вы можете вызывать частные методы).
Пример:
'string'.public_send(:size)
=> 6
Ответ №4:
Вы также можете добавить хэш для отправки параметров методу.
send("method_name", "abc", {add more parameters in this hash})