ようへいの日々精進XP

よかろうもん

2018 年 04 月 11 日(水)

ジョギング

  • お休み

日課

  • お休み

foo, bar, baz, その後って...

RFC に明記されているらしい.

東京出張

  • だいぶん飛行機が揺れた
  • 東京も暖かくて T シャツで過ごせる感じ ( 夜は寒いけど
  • 打ち合わせがキャンセルになってしまったので, 色々と課題となっていたタスクについて, 技術的な検証等を行った
  • 夜は会社の中途採用イベントを見学
  • その後, 前前職の同僚と新橋の馬肉料理屋さんで一杯, 色々と懐かしい話に花が咲いた

sidekiq

  • 非同期処理を実装する必要があって, sidekiq を試してみたけど動かすことが出来なかった
  • ちゃんとドキュメントを読んで, チュートリアルからやるべきだった...

Python で何かを作る時の作法とか

Python でライブラリ (書いたことないけど) や, スクリプトを実装する際の作法を身に付けたくて, テストの書き方や, 複数の Python バージョンでテストが実行出来るように試行錯誤している.

mock を使ったり, tox と Travis CI で複数の Python バージョンでテストさせたりしているけど, まだ何となくしか理解出来ていない感じ. 引続き, 手を動かしていきたいと思う.

今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (21) ~

もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.

Q31. オブジェクト指向

B と出力するコードを全て選べ.

#1.
class Object
  def self.const_missing a
    p "#{a}"
  end
end
B

#2.
class Module
  def self.const_missing a
    p "#{a}"
  end
end
B

#3.
class Hoge
  def self.const_missing a
    p "#{a}"
  end
end
Hoge::B

#4.
class Hoge
  def self.const_missing a
    p "#{a}"
  end
end
B
  1. と 3.

以下, irb での実行例.

irb(main):001:0> class Object
irb(main):002:1>   def self.const_missing a
irb(main):003:2>     p "#{a}"
irb(main):004:2>   end
irb(main):005:1> end
=> :const_missing
irb(main):006:0> B
"B"
=> "B"
irb(main):007:0> class Hoge
irb(main):008:1>   def self.const_missing a
irb(main):009:2>     p "#{a}"
irb(main):010:2>   end
irb(main):011:1> end
=> :const_missing
irb(main):012:0> Hoge::B
"B"
=> "B"

以下, 解説より抜粋.

  • const_missing は, クラスに定数が定義されていない場合に呼び出されるメソッド
  • const_missing を定義することで, 存在しない定数にアクセスした場合の任意の処理を実行出来る

2 は Module クラスに const_missing を定義しており, 4 は Hoge クラスに const_missing を定義しているが, 呼び出している定数 B はトップレベル (Object クラス) の定数 B を呼び出している為, デフォルトの const_missing (NameError) が発生する.

irb(main):001:0> class Module
irb(main):002:1>   def self.const_missing a
irb(main):003:2>     p "#{a}"
irb(main):004:2>   end
irb(main):005:1> end
=> :const_missing
irb(main):006:0> B
NameError: uninitialized constant B
...
irb(main):007:0> class Hoge
irb(main):008:1>   def self.const_missing a
irb(main):009:2>     p "#{a}"
irb(main):010:2>   end
irb(main):011:1> end
=> :const_missing
irb(main):012:0> B
NameError: uninitialized constant B

Q32. 文法

以下の実行結果になるように, [ x ] に記述する適切なコードを全て選べ.

class Err1 < StandardError; end
class Err2 < Err1; end

begin
  [ x ]
rescue Err1 => ex
  puts 'Error'
end

以下, 出力結果.

Error
  1. raise Err1
  2. raise Err2

以下, irb での実行例.

irb(main):001:0> class Err1 < StandardError; end
=> nil
irb(main):002:0> class Err2 < Err1; end
=> nil
irb(main):003:0> 
irb(main):004:0* begin
irb(main):005:1*   raise Err1
irb(main):006:1> rescue Err1 => ex
irb(main):007:1>   puts 'Error'
irb(main):008:1> end
Error
=> nil
irb(main):009:0> begin
irb(main):010:1*   raise Err2
irb(main):011:1> rescue Err1 => ex
irb(main):012:1>   puts 'Error'
irb(main):013:1> end
Error
=> nil

以下, 解説より抜粋.

  • rescue Err1 は, Err1 と Err1 のサブクラス (Err2) の例外を捕捉する

Q33. オブジェクト指向

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

class Root
  def m
    puts 'Root'
  end
end

class A < Root
  def m
    puts 'A'
  end
end

class B < A
  def m
    puts 'B'
  end
  undef m
end

B.new.m
  1. 例外発生

以下, irb による実行例.

irb(main):001:0> class Root
irb(main):002:1>   def m
irb(main):003:2>     puts 'Root'
irb(main):004:2>   end
irb(main):005:1> end
=> :m
irb(main):006:0> 
irb(main):007:0* class A < Root
irb(main):008:1>   def m
irb(main):009:2>     puts 'A'
irb(main):010:2>   end
irb(main):011:1> end
=> :m
irb(main):012:0> 
irb(main):013:0* class B < A
irb(main):014:1>   def m
irb(main):015:2>     puts 'B'
irb(main):016:2>   end
irb(main):017:1>   undef m
irb(main):018:1> end
=> nil
irb(main):019:0> 
irb(main):020:0* B.new.m
NoMethodError: undefined method `m' for #<B:0x0056183afc5578>

以下, 解説より抜粋.

  • B#m は undef により定義が取り消されている
  • B.new.m を実行すると例外 NoMethodError が発生する

フムフム.