Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Написание метода DSL на ruby, который создаст метод с аргументами

Автор вопроса: jmcnevinОтветов: 2

Я пытаюсь написать DSL для фонового рабочего класса, и я немного застрял, пытаясь что-то сделать.

В идеале я должен быть в состоянии написать работника, как показано ниже...

job :job_name do |param1, param2|
  puts param1
end

Теперь, в моем рабочем суперклассе, я делаю что-то вроде этого...

class Worker
  def self.job(job_name, &block)
    define_method job_name do
      # stuck
    end
    # do some additional stuff here
  end
end

Что я хочу сделать, так это определить метод, который имеет доступ к аргументам блока, которые использовались в исходном вызове задания, чтобы я мог запустить это задание с помощью:

Worker.new.job_name(param1, param2)

Созданный метод должен быть функционально эквивалентен:

def job_name(param1, param2)
  puts param1
end

Это имеет какое-либо значение? Надеясь, что кто-то здесь может указать мне в правильном направлении.

rubydslmetaprogrammingjruby

Ответы

Ответ 1 · рейтинг 5 · knut

Вы ищете что-то вроде этого:

class Worker
  def self.job(job_name, &block)
    define_method job_name, &block
    # do some additional stuff here
  end
end

Worker.job(:my_job) do |a,b|
  puts "Called #{__method__} with param <#{a}> and <#{b}>"
end

#~ What I want to do is define a method that has access to the block arguments that were used in the original job call, so I could fire this job off with:
Worker.new.my_job(:param1,:param2) #-> Called my_job with param <param1> and <param2>

Ответ 2 · рейтинг 1 · Kyle

Что-то вроде этого?

class Worker
  def self.job(job_name, &block)
    define_method job_name, block
  end
end

Worker.job("foo"){ |x,y| puts "#{x} + #{y}" }
Worker.new.foo(1,2) # => 1 + 2

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы