ようへいの日々精進XP

よかろうもん

2018 年 06 月 05 日 (火)

ジョギング

  • 雨の為, お休み
  • 足の状態がイマイチだったので良い休みだった

日課

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

終日

  • 雨だった
  • 雨のせいか解らないけど, 肩から首筋に掛けて強い張りで終日辛かった

夕飯

  • パスタを作る

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

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)

String#scan と 正規表現

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

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

4 と表示される

以下, irb による確認.

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

以下, 解説より抜粋.

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

以下, 改めて, irb にて確認.

# String#scan でマッチした文字列を配列で返している
irb(main):002:0> p "Matz is my tEacher".scan(/[is|my]/)
["i", "s", "m", "y"]
=> ["i", "s", "m", "y"]
# Array#size でマッチした結果の size (length) で要素数を返す
irb(main):004:0> p "Matz is my tEacher".scan(/[is|my]/).class
Array
=> Array
irb(main):005:0> p "Matz is my tEacher".scan(/[is|my]/).size
4
=> 4
irb(main):006:0> p "Matz is my tEacher".scan(/[is|my]/).length
4
=> 4

以下, String#scan の実行例.

irb(main):007:0> p "foobar".scan(/../)     
["fo", "ob", "ar"]
=> ["fo", "ob", "ar"]
irb(main):008:0> p "foobar".scan("o")
["o", "o"]
=> ["o", "o"]
irb(main):009:0> p "foobarbazfoobarbaz".scan(/ba./)
["bar", "baz", "bar", "baz"]
=> ["bar", "baz", "bar", "baz"]
irb(main):010:0> p "foobar".scan(/./)
["f", "o", "o", "b", "a", "r"]
=> ["f", "o", "o", "b", "a", "r"]
irb(main):011:0> p "foobar".scan(/(.)/)
[["f"], ["o"], ["o"], ["b"], ["a"], ["r"]]
=> [["f"], ["o"], ["o"], ["b"], ["a"], ["r"]]
irb(main):012:0> p "foobarbazfoobarbaz".scan(/(ba)(.)/)
[["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]
=> [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]

アクセサメソッド

以下のコードで指定した行を書き換えた時,同じ結果になるものを選ぶ.

class C
  attr_accessor :v # ここを書き換える
end

c = C.new
c.v = 100
p c.v

以下, 解答.

# パターン 1
attr_reader :v
attr_writer :v

# パターン 2
def v=(other)
  @v = other
end
def v
  @v
end

以下, irb による確認.

# 設問コード
irb(main):001:0> class C
irb(main):002:1>   attr_accessor :v
irb(main):003:1> end
=> nil
irb(main):004:0> 
irb(main):005:0* c = C.new
=> #<C:0x00561953649a48>
irb(main):006:0> c.v = 100
=> 100
irb(main):007:0> p c.v
100
=> 100
# 解答 (1)
irb(main):008:0> class C
irb(main):009:1>   attr_reader :v
irb(main):010:1>   attr_writer :v  
irb(main):011:1> end
=> nil
irb(main):012:0> 
irb(main):013:0* c = C.new
=> #<C:0x005619535fcf18>
irb(main):014:0> c.v = 100
=> 100
irb(main):015:0> p c.v
100
=> 100
# 解答 (2)
irb(main):016:0> class C
irb(main):017:1>   def v=(other)
irb(main):018:2>     @v = other
irb(main):019:2>   end
irb(main):020:1>   def v
irb(main):021:2>     @v
irb(main):022:2>   end
irb(main):023:1> end
=> :v
irb(main):024:0> 
irb(main):025:0* c = C.new
=> #<C:0x005619535b1888>
irb(main):026:0> c.v = 100
=> 100
irb(main):027:0> p c.v
100
=> 100

以下, 解説より抜粋.

  • attr_accessorattr_readerattr_writer を同時に定義する
  • attr_readerattr_writer は, 以下のようにも定義出来る
def v=(other)
  @v = other
end
def v
  @v
end

フムフム.