ある場所で値を生成するメソッドを作成し、それをブロックで呼び出す別のメソッドにパラメーターとして渡したいと思います。私はそれができると確信していますが、どういうわけか正しい構文を見つけることができません。
私が達成しようとしていることを説明するためのサンプル(動作しない)コードを次に示します。
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))