中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

rubyのlambda内でyieldする

2015-05-29 15:03:15 | ruby

背景

メッソドチェインは便利(?)だけど、チェインの構成要素を単体テストするときに困る。 そこでブロックをlambdaなどで変数化したいと思うが、そのlambda内でyieldしたいときがある。 例えば、
a = lambda { |t,x|
  (1..t).each {
    yield x
  }
}

a.call(10000, 'abc') { |x|
  puts x
}
みたいな感じで。 ただこれを実行すると、
LocalJumpError: no block given (yield)
というエラーが出る。

yieldは出来ないが

lambda のブロックの引数に、&blockなどを書き、それをcallすることで、yield的なことは出来る。
a = lambda { |t,x,&block|
  (1..t).each {
    block.call x
  }
}

a.call(10000, 'abc') { |x|
  puts x
}
yieldって関数専用なのだろうか。ブロックも引数を撮れるのだから、対応しておいてもらえるといいのに。

参考: lambda - Ruby: yield block from a block? - Stack Overflow


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。