ツクールの説明では割とスルーされているyieldという関数。インタプリターなどにFiber.yield~みたいな記述がたくさんされているがこれが難解で意味不明。
Fiberはなにやら難しいみたいなので、ひとまずyieldってなんなの?を解決するために調べてみた。 で、yieldを調べるっていったのに一旦yieldから話題が反れます。それを知る前提にメソッドには引数と『ブロック』を渡すことができるということを知っていなければならないとのこと。つまりどういうことかというとこういうことです。
def mofumofu(n)
p 5 + n
end
mofumofu(2){p "あべし"}
#=> 7 |
実行結果は7です。
{ }で囲った部分がブロックですが実行結果には反映されてません。どこにいったのかって無視されたのです。 じゃあこのブロックをどうしたら反映させられるのっていうのところでyieldが登場するわけです。
def mofumofu(n)
p 5 + n
yield
end
mofumofu(2){p "あべし"}
#=> 7
#=> "あべし" |
yieldがブロックを引き取る形で"あべし"が出力されました。yieldがないとブロックを渡しても
お前の席ねーから!状態になってしまうわけですね。yieldはブロックの居場所を確保してくれる心優しい人なのです。
ちなみにyieldが記述されているメソッドにブロックを与えないで実行しようとするとLocalJumpErrorが発生してエラー落ちする模様。友達がやってこないと発狂する粘着質な面倒臭いやつだ。
ブロックを渡すか渡さないか不確かな時はこう書けばいいっぽい。
def mofumofu(n)
p 5 + n
yield if block_given?
end
mofumofu(2){p "あべし"}
mofumofu(3)
#=> 7
#=> "あべし"
#=> 8 |
block_given?という関数は呼び出し元のメソッドにブロックがある時にtrueを、そうでない時にはfalseを返してくれるので結果的に『ブロックがあればyieldがそれを実行し、なければyieldを無視する』構造になる。
で、これを知っていてなにが出来るのって話だけどrgss触って日の浅い僕には実用性が正直ピンときません。それでも『yieldはブロックを引き受ける関数だ』と覚えていればいつか役に立つ日が来るかもしれないし来ないかもしれない。 プログラミングって新しいこと覚えた最初のうちは、でっていう?の繰り返しです。ふとしたときに思い出してあれはこういう時活用するのか、みたいな。
で結局Fiber.yieldてなんなの?わかりません(ToT)
PR