Ruby, возьмите имя метода в качестве аргумента, затем отправьте его объекту - PullRequest
0 голосов
/ 06 июня 2018

Каков наилучший способ создать метод с таким поведением?

def foo(arg1, arg2, some_method_name)
  arg1.some_method_name(arg2)
end

Я знаю, что должна быть какая-то магия Руби, простая и чистая.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

В Ruby вызовы методов - это просто сообщения, отправляемые объекту.

Вы ищете

def foo(arg1, arg2, some_method_name)
  arg1.send(some_method_name.to_s, arg2)
end

Обратите внимание, что этот метод может обращаться как к открытым, так и к закрытым методам класса.;это, вероятно, желательно для тестирования, но если вы хотите, чтобы он не работал для частных методов, просто используйте public_send

def foo(arg1, arg2, some_method_name)
  arg1.public_send(some_method_name.to_s, arg2)
end

Если у вас может быть определен существующий метод отправки для этого объекта, просто замените sendс __send__

См. https://ruby -doc.org / core-2.5.1 / Object.html # method-i-send для получения дополнительной информации

0 голосов
/ 06 июня 2018

Также будет предложено иметь такой метод, где вы можете предоставить переменные аргументы для метода

def foo(arg1, method_name, *args)
  arg1.public_send(method_name, *args) # dynamically dispatch the method with the relevant arguments
end
foo("kiddorails", :upcase)        # KIDDORAILS
foo("kiddorails", :gsub, 's', '') # kiddorail
0 голосов
/ 06 июня 2018

Попробуйте Object#public_send:

def foo(arg1, arg2, some_method_name)
  arg1.public_send(some_method_name, arg2)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...