ようへいの日々精進XP

よかろうもん

2018 年 06 月 23 日 (土)

ジョギング

日課

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

結婚式 6 周年

ちょっと早いけど, 結婚から 6 年半ということで, 嬉野温泉に一泊で.

美肌の湯で奥さんにはいつまでも元気でいてほしい.

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

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)

Object クラス

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

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 クラスには * メソッドは定義されていないので, undefined method の例外となる

以下のように Object クラスに * メソッドを追加すれば利用出来る.

irb(main):001:0> class Object
irb(main):002:1>   def *(arg)
irb(main):003:2>     '*' + arg.to_s + '*'
irb(main):004:2>   end
irb(main):005:1> end
=> :*
irb(main):007:0> [1, 2, 3, 4].map(&self.method(:*))
=> ["*1*", "*2*", "*3*", "*4*"]

ちなみに, Object#method についてドキュメントより引用.

オブジェクトのメソッド name をオブジェクト化した Method オブジェクトを返します。

irb(main):006:0> me = -365.method(:abs)
=> #<Method: Fixnum#abs>
irb(main):007:0> me
=> #<Method: Fixnum#abs>
irb(main):008:0> me.call
=> 365
# 以下と同義
irb(main):009:0> -365.abs
=> 365

キーワード引数

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

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

以下, 解説より抜粋.

  • キーワード引数は省略することが出来ない
  • シンボル: 値 の形式で引数を指定する

設問では, 以下のように修正する.

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(arg: 100)
100
=> nil

フムフム.