ようへいの日々精進XP

よかろうもん

2018 年 05 月 27 日(日)

ジョギング

日課

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

放送大学レポート提出

このレポートを出さないと単位認定試験を受けることが出来ないということで頑張った. そして, LaTeX で作成したった.

inokara.hateblo.jp

LaTeX 楽しかった.

担々麺

ランチは近所の担々麺. 自分が食べた担々麺の中でかなり上位に食い込んでくる美味しさ.

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

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 Object
  CONST = "10"
  def const_succ
    CONST.succ!
  end
end

class Cls1
  const_succ
  class << self
    const_succ
  end
end

class Cls2
  const_succ
  def initialize
    const_succ
  end
end

Cls1.new
Cls2.new

p Object::CONST

15 が出力される

以下, irb にて動作確認.

irb(main):023:0> p Object::CONST
"15"
=> "15"

以下, 解説より抜粋.

  • Object クラスにメソッドを定義すると, 特異クラスでもそのメソッドを利用することが出来る
  • 設問のプログラムを順に実行すると, 答えは 15 になる
  • String#succ メソッドは self の「次の」文字列を返す
  • 定数 CONST に対して, 破壊的メソッド succ! を呼び出している為, CONST の値はカウントアップされる

以下, 諸々確認.

# Object クラスにメソッドを定義
irb(main):001:0> class Object
irb(main):002:1>   CONST = "10"
irb(main):003:1>   def const_succ
irb(main):004:2>     CONST.succ!
irb(main):005:2>   end
irb(main):006:1> end
=> :const_succ
irb(main):007:0> const_succ
=> "11"
irb(main):008:0> const_succ
=> "12"
# 特異メソッド (クラスメソッド) で const_succ が利用可能
irb(main):009:0> class Cls1
irb(main):010:1>   class << self
irb(main):011:2>     const_succ
irb(main):012:2>   end
irb(main):013:1> end
=> "13"
irb(main):014:0> Cls1.const_succ
=> "14"

定数に対する succ メソッドの呼び出し例.

irb(main):001:0> CONST = '1'
=> "1"
irb(main):002:0> CONST = '2'
(irb):2: warning: already initialized constant CONST
(irb):1: warning: previous definition of CONST was here
=> "2"
irb(main):003:0> CONST.succ
=> "3"
irb(main):004:0> CONST.succ
=> "3"
irb(main):005:0> CONST.succ
=> "3"
irb(main):006:0> CONST.succ!
=> "3"
irb(main):007:0> CONST.succ!
=> "4"

通常, 定数への再代入はワーニングが出てしまう. succ メソッドを呼び出すと, 最初に呼び出された際にはカウントアップ (3 になる) されるが, その後, 何度も succ メソッドを呼び出してもカウントアップされない. 破壊的メソッド succ! を呼び出すとカウントアップされる.

正規表現

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

p "Nut rage incident"[/[J-P]\w+[^ ]/]

Nut と表示される

以下, irb による確認.

irb(main):001:0> p "Nut rage incident"[/[J-P]\w+[^ ]/]
"Nut"
=> "Nut"

以下, 解説より抜粋.

  • 正規表現[J-P] は囲まれた文字の 1 つ 1 つにマッチする
  • J-P は大文字の J から P の 1 文字にマッチする
  • \w は大文字, 小文字, 数字とアンダーバー(_) にマッチする
  • + は直前の文字が, 1回以上の繰り返しにマッチする
  • [^ ] は空白以外にマッチする

ということで, 設問では Nut という文字列がマッチする.

以下, よく使われる文字クラスには, 以下のような省略記法がある.

省略記法 文字クラス
\w 単語構成文字 [a-zA-Z0-9_]
\W 非単語構成文字 [^a-zA-Z0-9_]
\s 空白文字 [ \t\r\n\f\v]
\S 非空白文字 [^ \t\r\n\f\v]
\d 10進数字 [0-9]
\D 非10進数字 [^0-9]
\h 16進数字 [0-9a-fA-F]
\H 非16進数字 [^0-9a-fA-F]

フムフム.