Ruby преобразует строку в имя метода

#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})