ジョギング
- 香椎浜 x 2 周
- 徹底的に熱い (暑いではなく, もはや熱い)
日課
- (腕立て x 50 + 腹筋 x 50) x 3
カラオケトレーニング
週末恒例の奥さんとのカラオケトレーニング. 今日は 2 時間. 奥さんの調子が悪そうだったけど, イキイキと楽しく歌っている姿を見ると嬉しい.
今日のるびぃ ~ ひさびさに IT トレメ (1) ~
irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
IT トレメ はちょっと易しい問題が並んでいるけど, 問題に慣れる, 基礎を叩き込むという意味で活用している. 全問正解が前提だが, 問題を解く上で疑問に感じた問題を掘り下げる.
Q6 例外
以下のコードを実行すると何が表示されるか.
class Error1 < StandardError; end class Error2 < Error1; end begin raise Error2 rescue Error1 => ex puts ex.class end
解答は...
Error2 が出力される
以下, irb にて確認.
irb(main):001:0> class Error1 < StandardError; end => nil irb(main):002:0> class Error2 < Error1; end => nil irb(main):003:0> begin irb(main):004:1* raise Error2 irb(main):005:1> rescue Error1 => ex irb(main):006:1> puts ex.class irb(main):007:1> end Error2 => nil
以下, 解説.
- rescue 節で捕捉できる例外は, 指定した例外クラスと, そのクラスのサブクラス
- 設問では, rescue 対象は Error1 と指定しているが, サブクラスの Error2 が raise されている為, Error2 の例外も捕捉することが出来る
Q41
以下のそれぞれのコードを実行した場合に何が出力されるか.
[コード1] class Foo Const = "foo" def foo puts Const end end Foo.new.foo [コード2] module M def foo puts Const end end class Foo Const = "foo" include M end Foo.new.foo
以下, 解答.
foo
例外が発生する (NameError)
以下, irb にて確認.
# コード 2 について irb(main):001:0> module M irb(main):002:1> def foo irb(main):003:2> puts Const irb(main):004:2> end irb(main):005:1> end => :foo irb(main):006:0> class Foo irb(main):007:1> Const = 'Foo' irb(main):008:1> include M irb(main):009:1> end => Foo irb(main):010:0> Foo.new.foo NameError: uninitialized constant M::Const
- module M 内に定数 Const が定義されていない為, NameError が発生する
Q42
以下のそれぞれのコードを実行した場合に何が出力されるか.
[コード1] class Foo def foo puts "foo" end end class Bar < Foo def foo puts "bar" end end class Bar undef_method :foo end Bar.new.foo [コード2] class Foo def foo puts "foo" end end class Bar < Foo def foo puts "bar" end end class Bar remove_method :foo end Bar.new.foo
以下, 解答.
NoMethodError
foo
以下, irb にて確認.
[コード 1] ... 略 ... irb(main):014:0> Bar.new.foo NoMethodError: undefined method `foo' for #<Bar:0x00556348e66788> [コード 2] ... 略 ... irb(main):014:0> Bar.new.foo foo => nil
以下, 解説.
- remove_method しても, スーパークラスに同名クラスがある場合にはそのメソッドを呼び出すことが出来る
Q49
以下のコードを実行すると何が表示されるか.
[コード] class Bar def foo puts "barbarbar" end end class Foo < Bar def initialize(obj) obj.foo end def foo puts "foofoofoo" end end Foo.new(Foo.new(Bar.new))
以下, 解答.
barbarbar foofoofoo
以下, irb にて確認.
... 略 ... irb(main):014:0> Foo.new(Bar.new) barbarbar => #<Foo:0x0056012a830230> irb(main):015:0> f = Foo.new(Bar.new) barbarbar => #<Foo:0x0056012a801520> irb(main):016:0> Foo.new(f) foofoofoo => #<Foo:0x0056012a7fd8f8> irb(main):017:0> Foo.new(Foo.new(Bar.new)) barbarbar foofoofoo => #<Foo:0x0056012a641a50>
フムフム.