ようへいの日々精進XP

よかろうもん

2018 年 05 月 16 日(水)

ジョギング

  • 自宅 → 香椎宮香椎浜でだいたい 30 分くらい
  • 今日は踏切にははまらなかった

日課

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

暑い

  • もう夏なんぢゃないかと思うくらい暑かった...

野菜

昨年末から年始にかけてのあの野菜の値段が高騰したのが嘘のよう...

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

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)

mix-in

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

module Mod
  def c
    "M#c"
  end
end

class Cls
  include Mod
end

p Cls.methods.include? :c

false

以下, irb にて確認.

irb(main):001:0> module Mod
irb(main):002:1>   def c
irb(main):003:2>     "M#c"
irb(main):004:2>   end
irb(main):005:1> end
=> :c
irb(main):006:0> 
irb(main):007:0* class Cls
irb(main):008:1>   include Mod
irb(main):009:1> end
=> Cls
irb(main):010:0> 
irb(main):011:0* p Cls.methods.include? :c
false
=> false

え, なんでやねんってなりそうだけど, 以下の点に注意する必要がある.

  • include Mod でモジュールのメソッドを mix-in している
  • Cls.methods では特異メソッド表示する
  • Cls#cインスタンスメソッドである為, Cls.methods の結果には含まれない

以下のように書くと true となる.

irb(main):013:0> p Cls.new.methods.include? :c
true
=> true

以下のように extend で mix-in した場合にも true となる.

irb(main):001:0> module Mod
irb(main):002:1>   def c
irb(main):003:2>     "M#c"
irb(main):004:2>   end
irb(main):005:1> end
=> :c
irb(main):006:0> 
irb(main):007:0* class Cls
irb(main):008:1>   extend Mod
irb(main):009:1> end
=> Cls
irb(main):010:0> 
irb(main):011:0* p Cls.methods.include? :c
true
=> true

クラスメソッド (特異メソッド)

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

class Cls
  class << Cls
    def foo
      'foo'
    end
  end

  def foo
    'bar'
  end
end

p Cls.new.foo

bar

以下, irb にて確認.

(略)
irb(main):013:0* p Cls.new.foo
"bar"
=> "bar"
  • 特異クラス内 class << Cls; end で宣言されたメソッドは特異メソッド (クラスメソッド) となる
  • 特異メソッドは def Cls.hoge: end でも宣言することが可能
  • 設問では, インスタンスを作成 (Cls.new) して, インスタンスメソッド (foo) を呼び出している

特異メソッドを呼ぶ場合には, 以下のように書く.

irb(main):014:0> p Cls.foo
"foo"
=> "foo"

フムフム.