ようへいの日々精進XP

よかろうもん

2018 年 07 月 27 日 (金)

ジョギング

  • お休み

日課

  • お休み

色々

  • 放送大学の単位認定試験はやれる範囲で頑張った
  • Ruby Gold 4 回目, やっと合格した! 88 点, 嬉しかった (詳細は別途ブログ書こう)

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

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

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

文法 (20)

Q8. 以下の実行結果になるように, [ x ] に記述する適切なコードを選べ.

# コード
def hoge(*args)
  p [ x ]
end
hoge([1, 2, 3])

# 実行結果
[1, 2, 3]

以下, 解答.

  1. *args

以下, irb にて確認.

irb(main):001:0> def hoge(*args)
irb(main):002:1>   p *args
irb(main):003:1> end
=> :hoge
irb(main):004:0> hoge([1, 2, 3])
[1, 2, 3]
=> [1, 2, 3]

以下, 解説より抜粋.

  • * が付いたメソッド引数は可変長引数となり, 配列として扱われる
  • hoge に配列 [1, 2, 3] を渡すと, args[0] に格納される為, 実行結果を [1, 2, 3] とする為には, args[0] 又は *args と記述する

文法 (21)

Q9. 以下の実行結果になるように, [ x ] に記述する適切なコードを選べ.

# コード
def hoge [ x ]
  puts "#{x}, #{y}, #{params[:z]}"
end
hoge x:1, z:3

# 実行結果
1, 2, 3

以下, 解答.

  1. (x:, y: 2, **params)

以下, irb にて確認.

irb(main):001:0> def hoge (x:, y: 2, **params)
irb(main):002:1>   puts "#{x}, #{y}, #{params[:z]}"
irb(main):003:1> end
=> :hoge
irb(main):004:0> hoge x:1, z:3
1, 2, 3
=> nil

以下, 解説より抜粋.

  • キーワード引数の中で任意の値を受け取れるようにしたい場合は, **params のように引数の前に ** を付与することで, 明示的に定義したキーワード以外の引数を Hash オブジェクトで受け取ることが出来る

文法 (22)

Q10. 以下の実行結果になるように, [ x ] に記述する適切なコードを選べ.

# コード
hi = [ x ]
p hi.call('World')

# 実行結果
"Hello, World"

以下, 解答.

  1. ->(x){ puts "Hello, #{x}." }

以下, irb にて確認.

irb(main):001:0> hi = ->(x){ puts "Hello, #{x}." }
=> #<Proc:0x0055eb65e754e0@(irb):1 (lambda)>
irb(main):002:0> p hi.call('World')
Hello, World.
nil
=> nil

以下, 解説より抜粋.

  • lambda 式
  • Ruby 1.9 から追加された

設問のコードを Proc.new で書き換えると以下のようになる.

irb(main):007:0> hi = Proc.new { |x| puts "Hello, #{x}." }
=> #<Proc:0x0055eb65dc2ca0@(irb):7>
irb(main):008:0> p hi.call('World')
Hello, World.
nil
=> nil

文法 (23)

Q11. 以下の実行結果になるように, [ x ] と [ y ] に記述する適切なコードを選べ.

# コード
a, b = [ x ] do
  for x in 1..10
    for y in 1..10
      [ y ] if x + y == 10
    end
  end
end

puts a, b

# 実行結果
1
9

以下, 解答.

  1. [ x ] = catch :exit [ y ] = throw :exit, [x, y]

以下, irb にて確認.

irb(main):001:0> a, b = catch :exit do
irb(main):002:1*   for x in 1..10
irb(main):003:2>     for y in 1..10
irb(main):004:3>       throw :exit, [x, y] if x + y == 10
irb(main):005:3>     end
irb(main):006:2>   end
irb(main):007:1> end
=> [1, 9]
irb(main):008:0> 
irb(main):009:0* puts a, b
1
9
=> nil

以下, 解説より抜粋.

  • throw メソッドを呼ぶと, 第一引数で指定したタグのある catch ブロックまでジャンプする
  • この時に throw メソッドの第二引数に渡した値が catch メソッドの戻り値となる

フムフム.