ようへいの日々精進XP

よかろうもん

2018 年 05 月 15 日(火)

ジョギング

  • 香椎宮経由の香椎浜までで 35 分くらい
  • 踏切で 5 分くらい待たされる...朝の香椎参道口には要注意 (別ルートを開拓した)

日課

  • お休み

暑くなってきた...

  • まだ 5 月なのに...

筋違いな質問

  • ヌーラボさんの Backlog で提供されている古い API 廃止のアナウンスを受けて
  • Jenkins の Backlog API への影響って無いのかなーってヌーラボさんに聞くことではなかったのかもしれない
  • ヌーラボさんの中の方が作られているので, 思わずツイッターで聞いてしまったけど, そもそも OSS で提供されているので, OSS としての聞き方があったよな... と反省

知らないことばかり

  • この歳になっても知らないことが多いと反省
  • 色々と話を聴いてホー, おおー, みたいなリアクションしか出来なかったけど, 世の中の広さを感じた時間だった

今日のるびぃ ~ 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"

フムフム.