ようへいの日々精進XP

よかろうもん

2018 年 07 月 25 日 (水)

ジョギング

  • お休み

日課

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

天神でお仕事

  • オルターブースさんのスペースを間借りして作業
  • いつもとは違うスペースなので, いい感じの気分転換になっていつもよりも仕事が捗った気がする

夕飯

  • 宅配ピザ
  • コスパがいいんだか, 悪いんだかわからないけどお腹いっぱいになった

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (15) 文法 (5) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

文法 (13)

Q35. 可変長引数について適切な記述を選べ.

以下, 解答.

  1. 可変長引数には * を付ける

以下, irb にて確認.

irb(main):001:0> def foo(*arg)
irb(main):002:1>   p arg.class
irb(main):003:1>   p arg
irb(main):004:1>   p *arg
irb(main):005:1> end
=> :foo
irb(main):006:0> foo(1, 2, 3, 4, 5)
Array
[1, 2, 3, 4, 5]
1
2
3
4
5
=> [1, 2, 3, 4, 5]
irb(main):007:0> 

以下, 解説より抜粋.

  • 可変長引数にはデフォルト値の指定出来ない
  • 引数は配列として扱われる
  • 可変長引数は一つのメソッドに一つしか指定出来ない

文法 (14) 以降は, 基礎力確認問題を解く

Q2. 以下のコードを実行すると何が表示されるか.

x, *y = *[0, 1, 2]
p x, y

以下, 解答.

  1. 0 <改行> [1, 2]

以下, irb にて確認.

irb(main):007:0> x, *y = *[0, 1, 2]
=> [0, 1, 2]
irb(main):008:0> p x, y
0
[1, 2]
=> [0, [1, 2]]
  • 多重代入
  • 右辺の * は無視して構わない
  • 左辺の x には, 配列の最初の要素が格納され, y には * が付いているので残りの要素が配列として格納される

文法 (15)

Q3. [ x ] に記述すると, 以下の実行結果にならないコードを全て選べ.

# コード
puts [ x ]

# 実行結果
0.8

以下, 解答.

  1. 4/5
  2. 4/5r

以下, irb にて確認.

irb(main):001:0> 4/5
=> 0
irb(main):002:0> 4.0/5
=> 0.8
irb(main):003:0> 4/5r
=> (4/5)
irb(main):004:0> 4/5.0
=> 0.8
irb(main):005:0> (4/5r).to_f
=> 0.8

以下, 解説より抜粋.

  • 整数 (Integer) 同士の演算結果は整数となり, 小数点以下は丸められる為, 選択肢 1 の結果は 0 になる
  • 選択肢 3 の 4/5r の結果は Rational クラスのオブジェクトを生成し, (4/5r).to_f とすれば 0.8 となる

文法 (16)

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

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

以下, 解答.

  1. StandardError と表示される

以下, irb にて確認.

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

以下, 解説より抜粋.

  • 設問において, begin 節の raise で発生する例外オブジェクトは Err2 である
  • rescue Err2 => ex では Err2, もしくは Err2 を継承した例外オブジェクトを対象とするように書かれているが...
  • rescue => e にて StandardError から派生する全ての例外を捕捉する為, この rescue => e で処理される

フムフム.