ようへいの日々精進XP

よかろうもん

2018 年 03 月 21 日(水)

ジョギング

  • 今日もお休み
  • 天気が大荒れ

日課

  • (腕立て 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

ふむふむ.