ジョギング
日課
- (腕立て 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'
以下, 解説より抜粋.
- 設問の
self
はObject
クラスのインスタンスになる 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
フムフム.