Ruby: Как вызвать метод, используя метод send, с хешем? - PullRequest
5 голосов
/ 10 сентября 2010

Допустим, у меня есть класс А с некоторыми методами.

Давайте скажем, что string methodName является одним из этих методов, и я уже знаю, какие параметры я хочу ему дать.Они находятся в хэше {'param1' => value1, 'param2' => value2}

Итак, у меня есть:

params = {'param1' => value1, 'param2' => value2}
a = A.new()
a.send(methodName, value1, value 2) # call method name with both params

Я хочу иметь возможность как-то вызвать этот методпередавая мой хэшВозможно ли это?

Ответы [ 2 ]

8 голосов
/ 10 сентября 2010

Убедитесь, что methodName является символом, а не строкой (например, methodName.to_sym)

Невозможно передать хеш в send, вам нужен массив, и ключи / значения в нем не в определенном порядке, но аргументы метода должны быть, поэтому вам нужен какой-то разумный способ получить значения в правильном порядке.

Тогда, я думаю, вам нужно использовать оператор splat (*) для передачи этого массива для отправки.

methodName = 'center'    
params = {'param1' => 20, 'param2' => '_'}.sort.collect{|k,v| v}
a = "This is a string"
a.send(methodName.to_sym, *params)

=> "__This is a string__"

Нечто подобное.

2 голосов
/ 20 ноября 2015

В настоящее время я использую Ruby 2.2.2, и вы можете передать хеш вместе с send, используя ключевые слова mechanic:

params = {param1: value1, param2: value2}
a = A.new()
a.send(methodName, params)
...