ようへいの日々精進XP

よかろうもん

2018 年 08 月 04 日 (土)

ジョギング

  • 香椎浜 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>

フムフム.