ジョギング
- 今日もお休み
- 天気が大荒れ
日課
- (腕立て x 50 + 腹筋 x 50) x 3
放送大学
- 入学金とか授業料を払ってきた
- 頑張るぞ
今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (4) ~
もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.
Q10. 文法 (Kernel.#lambda)
以下の実行結果になるように, [ x ] に記述する適切なコードを全て選ぶ.
hi = [ x ] p hi.call('World')
実行結果.
Hello, World.
以下, 解答.
->(x){ puts "Hello, #{x}." }
以下, irb での実行例.
irb(main):001:0> hi = ->(x){ puts "Hello, #{x}." } => #<Proc:0x0055e8385cf988@(irb):1 (lambda)> irb(main):002:0> p hi.call('World') Hello, World. nil => nil
以下, Proc.new で書いた場合.
irb(main):007:0> hi = Proc.new{|x| puts "Hello, #{x}." } => #<Proc:0x005636d20be708@(irb):7> irb(main):008:0> hi.call('World') Hello, World. => nil
書籍では, 以下が正解となっているが...
->{|x| puts "Hello, #{x}." }
irb で実行すると, SyntaxError となるので注意する.
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
以下, 解答.
a, b = catch :exit do for x in 1..10 for y in 1..10 throw :exit, [x, y] if x + y == 10 end end end puts a, b
以下, 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
以下, 解説より抜粋.
- Kernel.#throw メソッドを呼ぶと, 第一引数で指定した tag (設問では
:exit
) のある Kernel.#catch ブロックの終わりまでジャンプする - Kernel.#throw メソッドの第二引数に渡した値が Kernel.#catch メソッドの戻り値となる
Q12. オブジェクト指向
以下の実行結果になるように, [ x ] に記述する適切なコードを全て選ぶ.
class Super def greet 'Hello ' end end class Sub < Super def greet [ x ] + 'World' end end puts Sub.new.greet
以下, 実行結果.
Hello World.
以下, 解答.
super
以下, 解説より抜粋.
- スーパークラスの同名メソッドを呼び出す場合,
super
キーワードを利用する - 括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き渡されます
以下, ドキュメントより抜粋.
class Foo def foo(arg=nil) p arg end end class Bar < Foo def foo(arg) super(5) # 5 を引数にして呼び出す super(arg) # 5 を引数にして呼び出す super # 5 を引数にして呼び出す super(arg) の略記法 arg = 1 super # 1 を引数にして呼び出す super(arg) の略記法 super() # 引数なしで呼び出す end end Bar.new.foo 5
ふむふむ.