Справка по Ruby с динамическими методами - PullRequest
1 голос
/ 23 ноября 2010

Мне нужна помощь с определением динамического метода.

По сути, у меня есть много классов, которые находятся в одном модуле. Мне нужно сгенерировать список методов внутри каждого класса на основе переданного списка строк, который является специфическим для каждого класса (то есть разные классы имеют разные списки строк). Тело метода должно быть примерно таким:

client.call(the_string, @an_instance_variable)

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

Что-то вроде:

register_methods @@string_array

Так, скажем, «имя» - это строка в массиве, тогда он сгенерирует такой метод:

def name
  client.call("name", @an_instance_variable)
end

Надеюсь, это имеет смысл. Я зашла в тупик после того, как попробовала разные вещи в течение нескольких часов, и была бы очень благодарна за любой вклад. Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

IRB не доступен, но это должно работать

def register_methods strings
  strings.each do |s|
    define_method s.to_sym do
      client.call("name", @an_instance_variable)
    end
  end
end
0 голосов
/ 23 ноября 2010

Я не знаю, как вы собираетесь использовать @an_instance_variable, но вы также можете определить методы, которые принимают аргументы, например:

def register_methods *methods
  methods.each do |method|
    define_method method do |arg|
      client.call(method, arg)
    end
  end
end

Так что если вы отправляете register_methods ("name", "age") у вас было бы два новых метода, выглядящих так:

def name(arg)
  client.call("name", arg)
end

def age(arg)
  client.call("age", arg)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...