在ruby中编写一个DSL方法,它将创建一个带参数的方法

jmc*_*vin 2 ruby dsl metaprogramming jruby

我正在尝试为后台工作者类写一个DSL,我有点卡住尝试完成某些事情.

理想情况下,我应该能够像以下一样写一个工作者......

job :job_name do |param1, param2|
  puts param1
end
Run Code Online (Sandbox Code Playgroud)

现在,在我的工人超类课程中,我正在做这样的事......

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

想要做的是定义一个方法,该方法可以访问原始作业调用中使用的块参数,因此我可以通过以下方式解除此作业:

Worker.new.job_name(param1, param2)
Run Code Online (Sandbox Code Playgroud)

创建的方法应该在功能上等同于:

def job_name(param1, param2)
  puts param1
end
Run Code Online (Sandbox Code Playgroud)

这有任何意义吗?希望有人能指出我正确的方向.

knu*_*nut 5

你找这样的东西:

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>
Run Code Online (Sandbox Code Playgroud)