ジョギング
日課
- (腕立て 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
- 例外発生
以下, 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 メソッドについて, 適切な記述を選べ.
- freeze, 特異メソッド等の情報も含めてコピーする
- 参照先のオブジェクトはコピーされない
以下, 解説より抜粋.
- 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
フムフム.