2012-08-14 19 views
2

我正在尝试为后台工作者类编写一个DSL,并且我试图完成一些工作。在Ruby中编写一个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 

这有任何意义吗?希望这里的某个人能指引我正确的方向。

回答

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> 
+0

你打败了我。很好的答案。 +1 – Kyle 2012-08-14 20:06:03

+0

像梦一样工作。我越来越近了。 :) – jmcnevin 2012-08-14 20:28:03

1

像这样的事情?

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 
相关问题