ジョギング
- お休み
日課
- お休み
色々
今日のるびぃ ~ 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]
以下, 解答.
- *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
以下, 解答.
- (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"
以下, 解答.
- ->(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
以下, 解答.
[ 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
メソッドの戻り値となる
フムフム.