ようへいの日々精進XP

よかろうもん

2018 年 07 月 21 日 (土)

ジョギング

日課

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

豚汁

  • 奥さんお手製のお味噌で豚汁
  • うまかった!

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (11) 文法 (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)

文法 (1)

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

[1, 2, 3].each do |i|
  num = i
end

puts num

以下, 解答.

  1. 例外発生

以下, irb にて確認.

irb(main):001:0> [1, 2, 3].each do |i|
irb(main):002:1*   num = i
irb(main):003:1> end
=> [1, 2, 3]
irb(main):004:0> 
irb(main):005:0* puts num
NameError: undefined local variable or method `num' for main:Object

以下, 解説より抜粋.

  • each ブロック内で宣言した変数は, ブロック外で無効となる
  • 無効となる為, 例外 (NameError) が発生する

文法 (2)

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

ary = Array.new(3, 'a')
ary[0].next!
p ary

以下, 解答.

  1. ["b", "b", "b"] と表示

以下, irb にて確認.

irb(main):001:0> ary = Array.new(3, 'a')
=> ["a", "a", "a"]
irb(main):002:0> ary[0].next!
=> "b"
irb(main):003:0> p ary
["b", "b", "b"]
=> ["b", "b", "b"]

以下, 解説より抜粋.

  • Array.new(3, 'a') は, サイズ 3 の配列を生成し, 文字列オブジェクト "a" を全ての要素に設定する
  • 文字列オブジェクト "a" は全て同一のオブジェクトになり, 配列の要素は, すべて同一の文字列オブジェクト "a" を参照する
  • その為, 1 つの要素を変更すると, すべての要素が変更される

文法 (3)

Q7. 以下のコードで, case 文の比較に使用されている演算子はどれか.

a = [1, 'Hello', false]
a.each do |x|
  puts case x
  when String then 'string'
  when Numeric then 'number'
  when TrueClass, FalseClass then 'boolean'
  end
end

以下, 解答.


以下, irb にて確認.

irb(main):001:0> a = [1, 'Hello', false]
=> [1, "Hello", false]
irb(main):002:0> a.each do |x|
irb(main):003:1*   puts case x
irb(main):004:2>   when String then 'string'
irb(main):005:2>   when Numeric then 'number'
irb(main):006:2>   when TrueClass, FalseClass then 'boolean'
irb(main):007:2>   end
irb(main):008:1> end
number
string
boolean
=> [1, "Hello", false]

以下, 解説より抜粋.

  • case 文の比較には, === を利用する

文法 (4)

Q10. 4 行目で生成 (raise) される例外オブジェクトのクラスは何ですか.

begin
  'cat'.narrow
rescue NameError
  raise
end

以下, 解答.

  1. NoMethodError

以下, irb にて確認.

irb(main):001:0> begin
irb(main):002:1*   'cat'.narrow
irb(main):003:1> rescue NameError
irb(main):004:1>   raise
irb(main):005:1> end
NoMethodError: undefined method `narrow' for "cat":String
...

以下, 解説より抜粋.

  • rescue 節の raise は, rescue 節が処理中の例外オブジェクトを再生成する
  • オブジェクトに存在しないメソッドを実行した場合, NoMethodError オブジェクトが発生する
  • 出題コードの 2 行目で NoMethodError オブジェクトが発生するので, 3 行目以降の rescue 節でキャッチした NoMethodError オブジェクトが raise される