ようへいの日々精進XP

よかろうもん

2018 年 07 月 08 日 (日)

ジョギング

  • 香椎浜 x 2 周
  • なんかギクシャクした感じがずーっと続いている

日課

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

夕飯

  • 奥さんが得意としている麻婆茄子
  • 美味しかった

終日

  • 色々とやりたいことがあったけど, 体調がイマイチで終日ダラダラしていた

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

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)

メソッドの可視性

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

class C
  protected
  def initialize
  end
end

p C.new.methods.include? :initialize

以下, 解答.

true

以下, irb にて確認.

irb(main):001:0> class C
irb(main):002:1>   protected
irb(main):003:1>   def initialize
irb(main):004:2>   end
irb(main):005:1> end
=> :initialize
irb(main):006:0> 
irb(main):007:0* p C.new.methods.include? :initialize
true
=> true

以下, 解説より抜粋.

  • initialize メソッドは private メソッドである
  • protected メソッドは仲間クラス (自クラスかサブクラスのレシーバー) へ公開されているが, それ以外のクラスには隠蔽されている
  • 仲間クラスから参照するために, メソッドとしては公開されている
  • Object#methodspublic 及び protected メソッドの名前を返す

以下, privatepublic だった場合の確認.

irb(main):001:0> class C
irb(main):002:1>   public
irb(main):003:1>   def initialize
irb(main):004:2>   end
irb(main):005:1> end
=> :initialize
irb(main):006:0> 
irb(main):007:0* p C.new.methods.include? :initialize
false
=> false
irb(main):008:0> p C.new.private_methods.include? :initialize
true
=> true

前述の通り, initialize メソッドは private メソッドであり, public を明示的に指定しても private のまま. protected を指定すると, initialize メソッドは protected メソッドになる. 尚, private を指定するパターンは割愛.

正規表現

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

p "Matz is my tEacher".scan(/[is|my]/).length

以下, 解答.

4 が出力される

以下, irb にて確認.

irb(main):001:0> p "Matz is my tEacher".scan(/[is|my]/).length
4
=> 4

以下, 解説より抜粋.

  • String#scan はマッチした部分文字列を配列で返す
  • 正規表現[] は囲まれた文字 1 つ 1 つにマッチする
  • |正規表現では OR のメタ文字である
  • 設問では, |[] に囲まれているため, これもマッチ対象となる

尚, String#scan については, 以下の通り.

self に対して pattern を繰り返しマッチし、 マッチした部分文字列の配列を返します。 pattern が正規表現で括弧を含む場合は、 括弧で括られたパターンにマッチした部分文字列の配列の配列を返します。

以下, String#scan のみの実行結果.

irb(main):002:0> p "Matz is my tEacher".scan(/[is|my]/)
["i", "s", "m", "y"]
=> ["i", "s", "m", "y"]

以下, String#scan で色々確認.

irb(main):005:0> p "Matz is my tEacher".scan(/my/)
["my"]
=> ["my"]
irb(main):006:0> p "Matz is my tEacher".scan(/[my]/)
["m", "y"]
=> ["m", "y"]
irb(main):007:0> p "Matz is my tEacher".scan(/is/)
["is"]
=> ["is"]
irb(main):008:0> p "Matz is my tEacher".scan(/[is]/)
["i", "s"]
=> ["i", "s"]
irb(main):009:0> p "Matz is my tEacher".scan('is')
["is"]
=> ["is"]
irb(main):010:0> p "Matz is my tEacher".scan('my')
["my"]
=> ["my"]

フムフム.