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

标签 ruby metaprogramming jruby dsl

我正在尝试为后台工作类编写 DSL,但我在尝试完成某些事情时遇到了一些困难。

理想情况下,我应该能够编写如下所示的工作人员...

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

现在,在我的 worker 父类(super class)中,我正在做这样的事情......

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

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

Worker.new.job_name(param1, param2)

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

def job_name(param1, param2)
  puts param1
end

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

最佳答案

你在找这样的东西吗:

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>

关于ruby - 在 ruby​​ 中编写一个 DSL 方法,它将创建一个带参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959726/

相关文章:

ruby - Ruby 的 XMPP 库

c++ - 如何在本身取决于另一个条件的条件下使用 std::enable_if?

c++ - 带转换运算符的模板参数

ruby - 在 JRuby 中,如何确定导致 java.lang.ThreadDeath 的原因?

Jruby rb 到 java 生成的类继承支持或变通方法

mysql - 如何在 MySQL 中将 BigDecimal 转换为整数

ruby-on-rails - 枚举时的不同样式(使用 each_with_index)

ruby - rpsec的 "let"是如何使用memoization的?

c++ - 使用元编程和可变参数模板填充静态模板化数组

java - jruby从 super java类调用方法