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

それは意味がありますか?ここの誰かが私を正しい方向に向けることができることを願っています。

4

2 に答える 2

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>
于 2012-08-14T20:02:15.413 に答える
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
于 2012-08-14T20:05:06.430 に答える