ジョギング
- お昼休みに
- 香椎浜 x 2 周
- 右足の太ももの前に痛み
- 右半身と左半身のバランスが悪い感じ
日課
- (腕立て x 50 + 腹筋 x 50) x 3
暑かったけど
- 夕方からは風が心地よい感じで, ずっと外で呑んでいたい気分になった
今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (3) オブジェクト指向系問題 (2) ~
irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
オブジェクト指向 (7)
以下のコードを実行するとどうなるか.
module Mod def foo puts 'Mod' end end class Cls1 def foo puts 'Cls1' end end class Cls2 < Cls1 include Mod undef foo end Cls2.new.foo
以下, 解答.
- 例外発生
以下, irb
... 省略 ... Cls2.new.fooirb(main):018:0> irb(main):019:0* Cls2.new.foo NoMethodError: undefined method `foo' for #<Cls2:0x007ffe538c53f8>
以下, 解説より抜粋.
- Cls1 クラスで定義された foo は, Cls2 クラスで
undef
されているので foo の定義が取り消されている
ちなみに, undef
しなかった場合には, 以下の通り Mod モジュールの foo メソッドが呼ばれる.
... 略 ... irb(main):016:0> Cls2.new.foo Mod => nil
オブジェクト指向 (8)
以下のコードを実行すると何が表示されるか, 尚, ファイル名は constant_1.rb とする.
class C1 MSG = 'msg1' MSG2 = 'msg2' class Cls2 MSG = 'C2.msg1' puts MSG puts MSG2 end puts MSG puts MSG2 end
以下, 解答.
C2.msg1
msg2
msg1
msg2
以下, irb にて確認.
irb(main):001:0> class C1 irb(main):002:1> MSG = 'msg1' irb(main):003:1> MSG2 = 'msg2' irb(main):004:1> class Cls2 irb(main):005:2> MSG = 'C2.msg1' irb(main):006:2> puts MSG irb(main):007:2> puts MSG2 irb(main):008:2> end irb(main):009:1> puts MSG irb(main):010:1> puts MSG2 irb(main):011:1> end C2.msg1 msg2 msg1 msg2 => nil
以下, 解説より抜粋.
- クラスがネストしている場合, 定数の探索は, 自クラス→外側のクラスの順で行われる
- 設問では 6 行目で宣言している MSG は, 5 行目で宣言している定数 MSG を参照する
- 7 行目の MSG2 は, 3 行目で宣言している MSG2 を参照する
ちなみに, 以下のようなコードだった場合にどのように出力されるか.
class Cls1 MSG = 'msg1' MSG2 = 'msg2' class Cls2 MSG = 'Cls2.msg1' puts Cls1::MSG puts MSG2 end puts Cls2::MSG puts MSG2 end
以下, 解答.
msg1
msg2
Cls2.msg1
msg2
以下, irb にて確認.
irb(main):001:0> class Cls1 irb(main):002:1> MSG = 'msg1' irb(main):003:1> MSG2 = 'msg2' irb(main):004:1> class Cls2 irb(main):005:2> MSG = 'Cls2.msg1' irb(main):006:2> puts Cls1::MSG irb(main):007:2> puts MSG2 irb(main):008:2> end irb(main):009:1> puts Cls2::MSG irb(main):010:1> puts MSG2 irb(main):011:1> end msg1 msg2 Cls2.msg1 msg2 => nil
フムフム.