ようへいの日々精進XP

よかろうもん

2018 年 04 月 15 日(日)

ジョギング

  • 香椎浜 x 3 周
  • 香椎浜は少し風が強くて, 走りづらかったし, なぜかわからないけど, 強く背中の張りを感じた
  • 明日から福岡マラソンの申し込みが始まるゾ!

日課

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

夕飯

  • パスタを作る
  • トマトソースは作らずにざく切りしたトマトのゴロゴロ感が残る感じで, あとアスパラも放り込んでイイ感じで奥さんも喜んでくれた
  • 奥さんが常備菜として煮込んでいた鶏と大根の煮物をつまみ食いしたけど, ご飯にもお酒にも合う逸品だった

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

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

Q43. 組み込みライブラリ

Kernel モジュールの freeze メソッドについて適切な記述を選べ.

clone は freeze, taint, 特異メソッド等の情報を含めた完全な複製を作成する クラスだけでなくモジュールも freeze 可能である

以下, 解説より抜粋.

  • clone と dup は, どちらもオブジェクトを複製する
  • clone は完全な複製を返す
  • dup は, オブジェクト及び taint 情報を含めた複製を返す
  • モジュール及び, モジュールをインクルードしたクラスも freeze 可能

以下, Ruby リファレンスより抜粋.

cloneメソッドとdupメソッドは、レシーバのオブジェクトのコピーを作成して返します。オブジェクトのコピーとは、同じ内容を持つ別のオブジェクトです。具体的には、元のオブジェクトと同じクラスの新しいオブジェクトで、元のオブジェクトのインスタンス変数を新しいオブジェクトにコピーしたものです。

以下, ドキュメントより抜粋.

dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。

Q44. オブジェクト指向

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

module Mod
  def Mod.foo
    puts 'Mod'
  end
end

class Cls1
  include Mod
  def Cls1.foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  def Cls2.foo
    puts 'Cls2'
  end
end

Cls2.new.foo
  1. 例外発生

以下, irb での実行例.

irb(main):020:0* Cls2.new.foo
NoMethodError: undefined method `foo' for #<Cls2:0x007febe10464b8>
  from (irb):20
  from /Users/kawahara/.rbenv/versions/2.3.0/bin/irb:11:in `<main>'

以下, 解説より抜粋.

  • 全てのメソッドは, いずれもクラスメソッドとして定義している
  • Cls2.new.foo で呼び出している fooインスタンスメソッドなので, 例外が発生する

Q45. 組み込みライブラリ

Kernel モジュールの clone メソッドについて, 適切な記述を選べ.

  1. freeze, 特異メソッド等の情報も含めてコピーする
  2. 参照先のオブジェクトはコピーされない

以下, 解説より抜粋.

  • Kernel モジュールの clone メソッドは, freeze, taint, 特異メソッド等の情報をふくめた完全なコピーを作成する
  • 参照先のオブジェクトはコピーしない (シャローコピー)

以下, ドキュメントのサンプルコードで確認.

irb(main):001:0> obj = "string"
=> "string"
irb(main):002:0> obj.taint
=> "string"
irb(main):003:0> def obj.fuga
irb(main):004:1> end
=> :fuga
# freeze
irb(main):005:0> obj.freeze
=> "string"
irb(main):006:0>
irb(main):007:0* p(obj.equal?(obj))
true
=> true
irb(main):008:0> p(obj == obj)
true
=> true
irb(main):009:0> p(obj.tainted?)
true
=> true
irb(main):010:0> p(obj.frozen?)
true
=> true
irb(main):011:0> p(obj.respond_to?(:fuga))
true
=> true
irb(main):012:0>
# clone
irb(main):013:0* obj_c = obj.clone
=> "string"
irb(main):014:0>
irb(main):015:0* p(obj.equal?(obj_c))
false
=> false
irb(main):016:0> p(obj == obj_c)
true
=> true
irb(main):017:0> p(obj_c.tainted?)
true
=> true
irb(main):018:0> p(obj_c.frozen?)
true
=> true
irb(main):019:0> p(obj_c.respond_to?(:fuga))
true
=> true
irb(main):020:0>
# dup
irb(main):021:0* obj_d = obj.dup
=> "string"
irb(main):022:0>
irb(main):023:0* p(obj.equal?(obj_d))
false
=> false
irb(main):024:0> p(obj == obj_d)
true
=> true
irb(main):025:0> p(obj_d.tainted?)
true
=> true
irb(main):026:0> p(obj_d.frozen?)
false
=> false
irb(main):027:0> p(obj_d.respond_to?(:fuga))
false
=> false

フムフム.