ようへいの日々精進XP

よかろうもん

2018 年 05 月 25 日(金)

ジョギング

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

奥さん

  • 体調が悪いなりになんとか乗り切ったようだ
  • 明日はゆっくりして欲しい

夕飯

  • 俺達の「よしもと」
  • コスパも良いし, 天ぷらは間違い無い

今日のるびぃ ~ REx - Ruby Examination にチャレンジ (10) ~

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)

文法

以下のコードを実行するとどうなるか.

p [1,2,3,4].map(&self.method(:*))

以下, irb による動作確認.

irb(main):001:0> p [1,2,3,4].map(&self.method(:*))
NameError: undefined method `*' for class `Object'

以下, 解説より抜粋.

  • 設問の selfObject クラスのインスタンスになる
  • Object クラスには * メソッドは未定義となる為, NameError: undefine method の例外となる

他の選択肢を実現する為には...

irb(main):014:0> p [1,2,3,4].map {|n| n * 2 }
[2, 4, 6, 8]
=> [2, 4, 6, 8]
irb(main):015:0> p [1,2,3,4].map {|n| n * n }
[1, 4, 9, 16]
=> [1, 4, 9, 16]
irb(main):016:0> p [1,2,3,4].each_with_object(2).map(&:*)
[2, 4, 6, 8]
=> [2, 4, 6, 8]
irb(main):017:0> p [1,2,3,4].each_with_object(2).map(&:**)
[1, 4, 9, 16]
=> [1, 4, 9, 16]

尚, (&:) 記法の場合, 引数を取るようなメソッドは利用出来ないので, Enumerable#each_with_object を利用した.

Enumerable#each_with_object について, ドキュメントより引用.

与えられた任意のオブジェクトと要素をブロックに渡し繰り返し、最初に与えられたオブジェクトを返します。 ブロックを省略した場合は、上の繰り返しをして、最初に与えたオブジェクトを 最後に返す Enumerator を返します。

以下, サンプル.

irb(main):018:0> (1..10).each_with_object([]) {|i, a| a << i*2 }
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

サンプルの解釈.

  • 与えられた任意のオブジェクト = []
  • 要素 = (1..10)
  • ブロック = {|i, a| a << i*2 }
  • 1 〜 10 の数値がブロックでは i に入ってきて, i * 2 の結果を [] に append していく
  • 10 まで同様の処理が行われたら, [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] を返す

文法

以下のコードを実行するとどうなるか.

def foo(arg:)
  puts arg
end

foo 100

エラーになる

以下, irb にて確認.

irb(main):001:0> def foo(arg:)
irb(main):002:1>   puts arg
irb(main):003:1> end
=> :foo
irb(main):004:0> 
irb(main):005:0* foo 100
ArgumentError: missing keyword: arg

以下, 解説より抜粋.

  • 設問の arg: はキーワード引数となる為, キー (arg:) 省略することは出来ない

エラーを回避する為の方法は, 以下の二つの書き方があると思う.

irb(main):001:0> def foo(arg)
irb(main):002:1>   puts arg
irb(main):003:1> end
=> :foo
irb(main):004:0> foo 100
100
=> nil
irb(main):005:0> foo(100)
100
=> nil
irb(main):006:0> def foo(arg:)
irb(main):007:1>   puts arg
irb(main):008:1> end
=> :foo
irb(main):009:0> 
irb(main):010:0* foo arg: 100
100
=> nil
irb(main):011:0> foo(arg: 100)
100
=> nil

フムフム.