ようへいの日々精進XP

よかろうもん

2018 年 03 月 24 日(土)

ジョギング

  • 香椎浜 x 1 周
  • 左ひざの内側、左足の足底筋痛みがあった為、1 周で止めといた

日課

  • 休み

体調

  • だいぶん良くなった

博多

  • 奥さんと博多をぶらぶら
  • しまむら楽器のカラオケ大会の審査員を飛び入りでしたりして、結構、内容の濃い一日だった

はじめの一歩

  • 奥さんと二人で色々と悩み抜いた末に一歩を踏み出すことにした
  • 奥さんには苦労をかけるかもしれないけど、後悔しないようにする為の一歩

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

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

Q19. オブジェクト指向

以下のコードを実行すると何が表示されるか.

class Object
  X = "X"
  def self.const_missing a
    p "#{a}"
  end
end
Y

トップクラスで定義された定数は Object クラスに所属する, Y は初期化されていない定数だが, Object クラスの const_missing が定義されているので, 以下のように出力されるはず.

Y

以下, irb での実行例.

irb(main):007:0> Y
"Y"
=> "Y"

Q20. オブジェクト指向

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

class C
  def hoge
    puts 'A'
  end
end

module M
  refine C do
    def hoge
      puts 'B'
    end
  end
end

c = C.new
c.hoge
[ x ] M
c.hoge

以下, 実行結果.

A
B

module M で定義されている refinement を利用する場合, [ x ] に入るのは...

using

になるはず.

以下, irb での実行例.

irb(main):015:0* c = C.new
=> #<C:0x00562131b0fe48>
irb(main):016:0> c.hoge
A
=> nil
irb(main):017:0> using M; c.hoge
B
=> nil

ちなみに, Module#refine のドキュメントより抜粋.

引数 klass で指定したクラスだけに対して、ブロックで指定した機能を提供で きるモジュールを定義します。定義した機能は Module#refine を使用せずに直 接 klass に対して変更を行う場合と異なり、限られた範囲のみ有効にできます。

using が有効になる範囲は以下の通り.

  • クラス・モジュール定義外で呼び出し場合はファイルの末尾まで
  • クラス・モジュール定義の中で呼び出した場合はそのクラス・モジュール定義の末尾まで

Q21. 組み込みライブラリ

Kernel モジュールのメソッドについて, 正しい記述を選ぶ.

  • require は拡張子無しでファイルをロード出来る
  • dup は特異メソッド等の情報をコピーしない

その他の選択肢について...

load は同じファイルを複数回ロードしない...わけでは無い => 複数回ロードする.

$ cat file1.rb 
# file1.rb
$var += 1
$ irb
irb(main):001:0> $var = 0
=> 0
irb(main):002:0> load 'file1.rb'
=> true
irb(main):003:0> load 'file1.rb'
=> true
irb(main):004:0> p $var
2
=> 2

freeze を実行すると, そのクラスはインスタンス化出来なくなる...わけでは無い => インスタンス化出来る.

irb(main):001:0> class Foo1; end
=> nil
irb(main):002:0> Foo1.freeze
=> Foo1
irb(main):003:0> Foo1.new
=> #<Foo1:0x005602b4c25a58>
irb(main):004:0> Foo1.frozen?
=> true

フムフム