1

ある場所で値を生成するメソッドを作成し、それをブロックで呼び出す別のメソッドにパラメーターとして渡したいと思います。私はそれができると確信していますが、どういうわけか正しい構文を見つけることができません。

私が達成しようとしていることを説明するためのサンプル(動作しない)コードを次に示します。

def yielder
  yield 1
  yield 2
  yield 3
end

def user(block)
  block.call { |x| puts x }
end

# later...
user(&yielder)

$ ruby x.rb
x.rb:2:in `yielder': no block given (yield) (LocalJumpError)
from x.rb:12:in `<main>'

FWIW、私の実際のコードでは、yielder と user は異なるクラスにあります。


アップデート

回答ありがとうございます。Andrew Grimm が述べたように、イテレータ メソッドにパラメータを取得させたいと考えています。私の元の例では、この詳細を省略しました。このスニペットは、指定された数までカウントする反復子を提供します。それを機能させるために、内側のブロックを明示的にしました。それは私が望むことをしますが、少し醜いです。誰かがこれを改善できるなら、私はその方法を知りたいと思っています。

def make_iter(upto)
  def iter(upto, block)
    (1 .. upto).each do |v|
      block.call(v)
    end
  end
  lambda { |block| iter(upto, block) }
end

def user(obj)
  obj.call Proc.new { |x| puts x }
end

# later...
user(make_iter(3))
4

4 に答える 4

4

これはラムダまたはバインドされていないメソッドを使用しませんが、最も簡単な方法です...

def f
  yield 1
  yield 2
end

def g x
  send x do |n|
    p n
  end
end

g :f
于 2010-10-20T22:30:59.220 に答える
2

を記述するときは&yielder、呼び出してから、結果に (convert-to-Proc) 演算子yielderを適用しようとしています。&もちろん、yielderブロックせずに呼び出すことはできません。必要なのは、メソッド自体への参照を取得することです。その行をに変更するだけuser(method :yielder)で機能します。

于 2010-10-20T22:31:19.583 に答える
1

これはあなたがやりたいことの線に沿っているかもしれないと思います:

def yielder
  yield 1
  yield 2
  yield 3
end

def user(meth)
  meth.call { |x| puts x }
end

# later...
user( Object.method(:yielder) )

関連情報: http://blog.sidu.in/2007/11/ruby-blocks-gotchas.html

于 2010-10-21T02:37:24.387 に答える