fc2ブログ

2024.11 «  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - » 2025.01
TOP > yield が分からないので勉強する

 ← Proc.new と proc と lambda と yield と部屋とYシャツと私 | TOP | Acts as authenticated 体験記 その6【まとめ】

yield が分からないので勉強する 

2007年11月27日 ()
rails の yield じゃなくて、ruby の 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 と xy を引数にして、つまり 1 と 2 と 100200 を引数にして、隠れ引数(ブロック)を実行している。

4.実行された隠れ引数(ブロック)は、a と b と c と d を引数に、つまり 1 と 2 と 100 と 200 を引数として受け取った後、それぞれを足し算して画面に表示している。



超複雑なんですけどwwwww。

でもこれでちょっと自分の中で整理がつきました。他の方の助けにもなれば、これ幸いです。

【広告】

[2007.11.27(Tue) 20:39] Rubyの文法Trackback(0) | Comments(11)
↑TOPへ


COMMENT

わかりやすい! by グリメラ
私も「yield」が意味不明だったのでいろいろ検索してみましたが、このエントリーが一番分かりやすいと思いました。
ありがとうございました。

ありがとうございます by 自分
かなり励みになります!今夜はアルコール炭酸入り麦ジュースがうまそうです。
これからもいろんなことを共有していきたいと思います。

by -
色付きの文字すばらしい
大変分かりヤスク、すっかりしました色付きの文字

こ、これは! by 自分
テスト書き込みのようなそうでないような。ありがとうございました。

教科書に蛍光ペンでなぞるように色をつけております。
結構楽しいです。

目がテン! by -
助かりました。
はっはー。ほっほー。って感じで読みました★
はてなよりわかりやすく、少しは理解できました。
あとは、MATZがyieldを作った意図がわかればすっきりすると思います。

血糖値が高い by 自分
ありがとうございます。このエントリーを書いていた2年前の自分が救われます!
「血糖値」などという例を出していて、この頃の自分は不健康だったの?と自分に問いかけています。
島根に行脚すればMATZさんにyieldの意図が聞けるカモしれませんね。

わかりやすかったです。 by shimanp
今まで見たyieldの説明の中で一番分かりやすかったです。
おかげですっきりしました。
ありがとうございます。

よかったです by 自分
誉められて良い気分です。
yieldのメリットまで説けるようになりたいなと思っています。
ところで「大根おろしの彼女募集記念レース」はまだ健在のようです。お暇でしたらご覧になって下さい。

すごい! by ぐつ
ありがとうございます。
なんのこっちゃわからんかったのが、なんとなくですが
理解できました!
他のページ見てもさっぱりでしたので、、ほんとうに
ありがとうございました。

by ryosuke0032
非常に分かりやすかったです。初学の私には大変ありがたかったので、ぜひお礼を言わせてください。

承認待ちコメント by -

コメントを閉じる▲
 ← Proc.new と proc と lambda と yield と部屋とYシャツと私 | TOP | Acts as authenticated 体験記 その6【まとめ】

COMMENT

私も「yield」が意味不明だったのでいろいろ検索してみましたが、このエントリーが一番分かりやすいと思いました。
ありがとうございました。
[ 2008.06.29(Sun) 16:45] URL | グリメラ #d3xRQPUk | EDIT |

かなり励みになります!今夜はアルコール炭酸入り麦ジュースがうまそうです。
これからもいろんなことを共有していきたいと思います。
[ 2008.06.30(Mon) 14:18] URL | 自分 #RaJW5m0Q | EDIT |

色付きの文字すばらしい
大変分かりヤスク、すっかりしました色付きの文字
[ 2009.04.30(Thu) 00:06] URL | #- | EDIT |

テスト書き込みのようなそうでないような。ありがとうございました。

教科書に蛍光ペンでなぞるように色をつけております。
結構楽しいです。
[ 2009.05.07(Thu) 12:55] URL | 自分 #RaJW5m0Q | EDIT |

助かりました。
はっはー。ほっほー。って感じで読みました★
はてなよりわかりやすく、少しは理解できました。
あとは、MATZがyieldを作った意図がわかればすっきりすると思います。
[ 2009.05.19(Tue) 15:44] URL | #- | EDIT |

ありがとうございます。このエントリーを書いていた2年前の自分が救われます!
「血糖値」などという例を出していて、この頃の自分は不健康だったの?と自分に問いかけています。
島根に行脚すればMATZさんにyieldの意図が聞けるカモしれませんね。
[ 2009.05.19(Tue) 18:27] URL | 自分 #RaJW5m0Q | EDIT |

今まで見たyieldの説明の中で一番分かりやすかったです。
おかげですっきりしました。
ありがとうございます。
[ 2010.02.21(Sun) 13:42] URL | shimanp #- | EDIT |

誉められて良い気分です。
yieldのメリットまで説けるようになりたいなと思っています。
ところで「大根おろしの彼女募集記念レース」はまだ健在のようです。お暇でしたらご覧になって下さい。
[ 2010.02.22(Mon) 00:48] URL | 自分 #JalddpaA | EDIT |

ありがとうございます。
なんのこっちゃわからんかったのが、なんとなくですが
理解できました!
他のページ見てもさっぱりでしたので、、ほんとうに
ありがとうございました。
[ 2011.08.02(Tue) 10:43] URL | ぐつ #Ddy.NW4. | EDIT |

非常に分かりやすかったです。初学の私には大変ありがたかったので、ぜひお礼を言わせてください。
[ 2013.11.16(Sat) 23:19] URL | ryosuke0032 #- | EDIT |

このコメントは管理者の承認待ちです
[ 2016.09.16(Fri) 09:14] URL | # | EDIT |

COMMENT POST















管理者にだけ表示

 ← Proc.new と proc と lambda と yield と部屋とYシャツと私 | TOP | Acts as authenticated 体験記 その6【まとめ】