【问题标题】:Writing a DSL method in ruby that will create a method with arguments在 ruby​​ 中编写一个 DSL 方法,该方法将创建一个带参数的方法
【发布时间】:2012-08-14 19:50:30
【问题描述】:

我正在尝试为后台工作者类编写 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

这有意义吗?希望这里有人能指出我正确的方向。

【问题讨论】:

    标签: ruby metaprogramming jruby dsl


    【解决方案1】:

    你是否在寻找这样的东西:

    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>
    

    【讨论】:

    • 你打败了我。不错的答案。 +1
    • 工作如梦。我越来越近了。 :)
    【解决方案2】:

    这样的?

    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
    

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2016-04-02
      • 2016-12-27
      • 2013-11-17
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多