質問編集履歴

1 追記

dongw

dongw score 111

2017/10/05 19:34  投稿

Rubyのyieldの挙動が理解できていません。
Rubyのyieldの挙動が理解できていません。
以下がサンプルコードになります。
```
def with_current_time
 yield Time.now
end
with_current_time do |now|
 now.year
end
```
このコードを動かすと
2017と表示されます。
```
with_current_time do |now|
 now.year
end
```
でメソッドを呼び出し。
yieldでブロックの中を呼び出す。
つまりブロックの中 = now.year を呼び出しているのだと考えました。
しかしyieldでnow.yearを呼び出してもエラーになると思います。
yieldの後にTime.nowが関連しているのでしょうか?
そのまま見たままだと、
yieldでnow.yearを呼び出し。
その後に続くTime.nowを呼び出し。
に受け取れます。
しかし挙動的にはTime.now.yearですよね?
何故でしょうか?
また呼び出す側としても
```
with_current_time do |now|
 now.year
end
```
となっており |now|
が付いているのは何故でしょうか?
```
array.each do |array1|
puts array1
end
```
となって配列の中身が一つづつ格納されている使い方は分かるのですが、
今回の||の使い方は分かりませんでした。合わせて教えて頂けるとありがたいです。
今回の||の使い方は分かりませんでした。合わせて教えて頂けるとありがたいです。
def with_current_time
 yield Time.now
end
with_current_time do |now|
 now.year
end
お二方回答ありがとうございます。
最初に勘違いしていたのは
`yield Time.nowは` `yield(Time.now)`という形だったのですね。
呼び出し順としては
```
with_current_time do |now|
 now.year
end
```
で、now.yearをブロックとしてメソッド(with_current_time)に渡す。
メソッド内のyield(Time.now)でyieldを呼び出し。
ここでのyield は `now.year`
引数で渡ってきたTime.nowは
```
with_current_time do |now|
 now.year
end
```
|now|が受け取る。
つまりnowはTime.nowになっている。
繋げてメソッドを読んで
`Time.now.year`
ということで間違いないでしょうか?
  • Ruby

    9693 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9097 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る