ruby
仕事で久し振りにrubyを触る。何年も前に初めて触ったときには、いまいち良く分かってなかったblockが分かる!分かるよ!
でもJavascriptやschemeに比べて変だ。
Proc/Kernel.proc/lambda で微妙に挙動が違う。
全てのメソッドにBlockが暗黙に与えることが出来、blockが与えられたかどうかblock_given?で確認してyieldでblockを呼出すIFはすごく変態的です。
returnの代わりにblockの内部では、nextを使わなければならないとか。
でもlambdaはreturnが使えるとか。この違いはまあ深い意味があるのかもしれんですけど。
def hoge(a) if block_given? yield a else a end end hoge(a) {|x| next 2 * a } #=> 20
今なら&つき引数で宣言して、callで呼び出すのが他の言語から来た人間には分かりやすくてよいですな。以下のように
def hoge(a, &func) func.call a end hoge(10) { |x| x * 2 } # => 20 ||< Fiberが他の言語でよく言われるgeneratorってやつか。