ジョギング
- お休み
- 朝からずーっと雨...夕方にはあがったけど
日課
- お休み
やましたさん
夕方, サロンパスを買いに外に出て, 帰りに「あんくるふじや」に寄ったら, 久しぶりにやましたさんに遭遇. 一杯だけお付き合いした. 元気そうでなにより.
今日のるびぃ ~ REx - Ruby Examination にチャレンジ (1) ~
REx - Ruby Examination の問題を自分なりにアレンジした上で 1 〜 3 問くらいずつ解いていく. 正直言ってかなり難しい. 尚, irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
lazy メソッド
以下のコードを実行するとどうなるか.
p (1..10).lazy.map{|num| num + 1 }.take(5).inject(1, &:+)
21
以下, irb による確認.
irb(main):001:0> p (1..10).lazy.map{|num| irb(main):002:1* num + 1 irb(main):003:1> }.take(5).inject(1, &:+) 21 => 21
以下, メモ.
p (1..10).lazy.map{|num| num + 1 }.take(5)
まず, このコードの実行結果から考えてみる.
- lazy メソッド
- Enumerable#lazy メソッドは map 等のメソッドの遅延評価を行うメソッド
- 設問だと map が呼ばれた時に初めてレシーバ
(1..10)
を評価する
- map メソッド
- Enumerable#map メソッドは, 各要素に対してブロックを評価した上で, その結果を全て含む配列で返す
- 設問だと,
1 + 1
,2 + 1
,3 + 1
... と順番に足し算していって,[2, 3, 4...]
という結果を返す
- take メソッド
- Enumerable#take メソッドは, Enumerable オブジェクトの先頭から n 要素を配列として返す
- 設問だと,
[2, 3, 4, 5, 6, 7, 8...]
から, 先頭の[2, 3, 4, 5, 6]
を配列として返す
そして, 最後の .inject(1, &:+)
について.
- inject メソッド
- Enumerable#inject はリストの畳み込み演算を行う
- 設問だと,
1
は初期値となり&:+
はinject(1){|result, n| result += n }
に読み替えることが出来る &:+
の書き方については, Symbol#to_proc を確認すること- inject メソッドの第二引数には,
ブロックの代わりに使われるメソッド名を表す Symbol オブジェクトを指定します
とある
&:+
表記については, 正直言って難しいが irb にて確認.
irb(main):002:0> (1..5).inject(1, &:+) => 16 irb(main):003:0> (1..5).inject(1){|result, n| result += n } => 16
ということで...
irb(main):001:0> p (1..10).lazy.map{|num| irb(main):002:1* num + 1 irb(main):003:1> }.take(5).inject(1, &:+) 21 => 21
は, [2, 3, 4, 5, 6]
を初期値 1 で inject (1 + (2 + 3 + 4 + 5 + 6)
) した結果 21 となる.
ムズカシイ...