Как определить метод генерации, получающий переменные аргументы - PullRequest
0 голосов
/ 13 сентября 2018

В определении класса ruby ​​я хочу определить генератор методов.Скажите нам, что каждый метод, который я хочу сгенерировать, отличается по символу и количеству параметров.Итак, у меня есть что-то вроде этого:

def self.my_define_service1(name) # generate for 1 parameter
    define_method(name) do |p1|
      # basic stuff
      call(name.intern, p1)
    end
end

def self.my_define_service2(name) # generate for 1 parameter
    define_method(name) do |p1, p2| 
      # basic stuff
      call(name.intern, p1,p2)
    end
end

# and so on ... many definitions as the number of parameters I have

call - это метод типа диспетчера, который получает имя символа и параметры.

Мой вопрос: можно ли написать только генератор?Примерно так

def self.my_define_service(name, *args)
    define_method(name) do |args| # <-- how to do here?
      # basic stuff
      call(name.intern, *args)
    end
end

и если ответ утвердительный, то как?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

С eval:

было намного проще
def self.my_define_service(name, *args)
    pars_list = args.join ', '
    d = %{
          def #{name}(#{pars_list})
            call(':#{name}', #{pars_list})
          end
        }
    eval d
  end
0 голосов
/ 14 сентября 2018

попробуйте с:

def self.my_define_service(name, *args)
  define_method(name) do |*args|
    # basic stuff
    call(name.intern, *args)
  end
end
...