yield が分からないので勉強する
そこで出した結論。
yield は、引数として渡されたブロックを実行するだけ
という風に今は理解しています。
どういうことか、というと例を見た方が早いと思います。
def method1
yield
end
method1 do
puts '血糖値'
end
を実行すると
血糖値
と表示されます。最初は、なんでこーなるの???????とハテナがたくさん付きました。
でも↓のように理解すると分かりやすくなりました。
1.
method1 do # ← この do から
puts '血糖値'
end # ← この end までを、1 つの引数として考える
method1 を呼んでいる箇所のうち、do ~ end までのブロック(という専門用語らしい)をまとめて method1 に渡す 1 つの引数として考える。
2.
def method1
yield
end
の宣言は、実は「ブロック」の隠れ引数があって実際は↓のような宣言をしていることとして考える
def method1(ブロック)
yield
end
3.
yield は、この隠れ引数の「ブロック」を実行しているだけ。
どうでしょうか。分かりやすくなったでしょうか。
yield が、隠れ引数を実行する、ということで、yield を 2 回書くと、隠れ引数を 2 回実行します。
def method1
yield # ←yield を 2 行書いてみた
yield # ←yield を 2 行書いてみた
end
method1 do
puts '血糖値'
end
を実行すると、
血糖値
血糖値
と表示されます。
もちろん yield の前後に普通の ruby コードを書くこともできます。↓↓↓↓↓↓
def method1
puts '1'
yield
puts '2'
yield
puts '3'
end
method1 do
puts '血糖値'
end
を実行すると、
1
血糖値
2
血糖値
3
と表示されます。
そして、yield の後ろに、引数を指定しておくこともできます。
def method1
yield(1,2,3,4) # ←引数を指定する
end
method1 do |a,b,c,d| # ←yield で指定した引数の数だけ、変数を宣言する
puts a + b + c + d
end
を実行すると、
10
と表示されます。
もうこの段階になると、頭がこんがらがってきますが、とにかく yield は隠れ引数を実行する、ということさえ忘れなければなんとかなりそうです。
もちろん、メソッドには、隠れ引数じゃない普通の引数を指定することができます。
def method1(x,y) # ←x と y はごく普通の引数
yield(1,2,x,y)
end
method1(100,200) do |a,b,c,d| # ←100 と 200 を普通の引数として渡す
puts a + b + c + d
end
を実行すると、
303
と表示されます。
こりゃあ参った。何をやっているのか超大根おろしの彼女募集記念レースで訳が分かりません。↓整理するとこういう具合です。
1.x に 100 を指定して、y に 200 を指定して、更に隠れ引数(ブロック)として do ~ end を指定して、合計 3 つの引数を method1 に渡す
method1(100,200) do |a,b,c,d|
puts a + b + c + d
end
2.method1 に引数は x と y しか宣言されていないが、隠れ引数(ブロック)がもう 1 つ実はあるので、合計 3 つの引数を取っている
def method1(x,y,ブロック)
↑みたいな
3.yield は、1 と 2 と x と y を引数にして、つまり 1 と 2 と 100 と 200 を引数にして、隠れ引数(ブロック)を実行している。
4.実行された隠れ引数(ブロック)は、a と b と c と d を引数に、つまり 1 と 2 と 100 と 200 を引数として受け取った後、それぞれを足し算して画面に表示している。
超複雑なんですけどwwwww。
でもこれでちょっと自分の中で整理がつきました。他の方の助けにもなれば、これ幸いです。
【広告】
COMMENT
これからもいろんなことを共有していきたいと思います。
大変分かりヤスク、すっかりしました色付きの文字
教科書に蛍光ペンでなぞるように色をつけております。
結構楽しいです。
はっはー。ほっほー。って感じで読みました★
はてなよりわかりやすく、少しは理解できました。
あとは、MATZがyieldを作った意図がわかればすっきりすると思います。
「血糖値」などという例を出していて、この頃の自分は不健康だったの?と自分に問いかけています。
島根に行脚すればMATZさんにyieldの意図が聞けるカモしれませんね。
おかげですっきりしました。
ありがとうございます。
yieldのメリットまで説けるようになりたいなと思っています。
ところで「大根おろしの彼女募集記念レース」はまだ健在のようです。お暇でしたらご覧になって下さい。
なんのこっちゃわからんかったのが、なんとなくですが
理解できました!
他のページ見てもさっぱりでしたので、、ほんとうに
ありがとうございました。
ありがとうございました。