ようへいの日々精進XP

よかろうもん

2018 年 05 月 13 日(日)

ジョギング

  • お休み
  • 朝からずーっと雨...夕方にはあがったけど

日課

  • お休み

やましたさん

夕方, サロンパスを買いに外に出て, 帰りに「あんくるふじや」に寄ったら, 久しぶりにやましたさんに遭遇. 一杯だけお付き合いした. 元気そうでなにより.

今日のるびぃ ~ 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 となる.

ムズカシイ...