ようへいの日々精進XP

よかろうもん

2018 年 03 月 19 日(月)

ジョギング

  • 雨の為, 休み
  • 左膝内側の痛みが引かない...

日課

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

久しぶりに

  • 夕飯は鍋だった

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

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

Q4. 文法 (例外)

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

class Err1 < StandardError; end
class Err2 < Err1; end
begin
  raise Err2
rescue => e
  puts 'StandardError'
rescue Err2 => ex
  puts ex.class
end
  • StandardError と表示される

以下, 解説より抜粋.

  • raise Err2 している時点で例外オブジェクトのクラスは Err2 となるが, 5 行目の resucue 節で StandardError から派生する全ての例外が捕捉される

以下, 実行結果.

irb(main):001:0> class Err1 < StandardError; end
=> nil
irb(main):002:0> class Err2 < Err1; end
=> nil
irb(main):003:0> begin
irb(main):004:1>   raise Err2
irb(main):005:1> rescue => e
irb(main):006:1>   puts 'StandardError'
irb(main):007:1> rescue Err2 => ex
irb(main):008:1>   puts ex.class
irb(main):009:1> end
StandardError
=> nil

Err2 の例外のみを捕捉したい場合には, 以下のように書くべき??

class Err1 < StandardError; end
class Err2 < Err1; end
begin
  raise Err2
rescue Err2 => ex
  puts ex.class
rescue => e
  puts 'StandardError'
end

尚, 例外クラスを指定しない場合, StandardError と, そのサブクラスが捕捉の対象となる.

Q5. 文法 (定数)

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

class C
  VAR = 0
  def VAR=v
    VAR = v
  end
  def VAR
    VAR
  end
end

c = C.new
c.VAR = 3
puts c.VAR
  • 4 行目でエラーが発生する (メソッド内での定数更新はエラーとなる)

以下, 実行例.

irb(main):001:0> class C
irb(main):002:1>   VAR = 0
irb(main):003:1>   def VAR=v
irb(main):004:2>     VAR = v
irb(main):005:2>   end
irb(main):006:1>   def VAR
irb(main):007:2>     VAR
irb(main):008:2>   end
irb(main):009:1> end
Traceback (most recent call last):
        1: from /home/kappa/.rbenv/versions/2.5.0/bin/irb:11:in `<main>'
SyntaxError ((irb):4: dynamic constant assignment
    VAR = v
        ^)

Q6. 文法

以下のコードの中で文法として正しいものを全て選ぶ.

1.upto 5 do |x| puts x end
1.upto(5) do |x| puts x end
1.upto(5) {|x| puts x }

以下, 実行例.

irb(main):001:0> 1.upto 5 do |x| puts x end
1
2
3
4
5
=> 1
irb(main):002:0> 1.upto(5) do |x| puts x end
1
2
3
4
5
=> 1
irb(main):003:0> 1.upto(5) {|x| puts x }
1
2
3
4
5
=> 1

以下, 解説より抜粋.

  • ブロック引数を { } で囲む場合には, 引数の () を省略することが出来ない
  • ブロック引数を do ~ end で囲む場合には, 引数の () は省略可能