ようへいの日々精進XP

よかろうもん

2018 年 03 月 20 日(火)

ジョギング

  • 天気が悪く、極端に寒いので今日もお休み
  • しばらく休んだでの左足の具合も良くなりつつある

日課

  • お休み

夕飯

  • 味噌出汁

放送大学

  • 合格した (と言っても, 特に試験も無いので...w)
  • 4 月から晴れて学生

今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (2) ~

もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.

Q7. 文法 (Proc)

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

[ x ]
tag(:p) {'Hello, World.'}

実行結果.

<p>Hello, World.</p>

さて, 上記のような実行結果になる為には...

# 選択 (1)
def tag(name)
  puts "<#{name}>#{yield}</#{name}>"
end

# 選択 (2)
def tag(name, &block)
  puts "<#{name}>#{block.call}</#{name}>"
end
  • yield を使ってブロックの処理を呼び出す
  • ブロックを引数として受け取って (& を付ける) を Proc#call を呼び出す

以下, irb を使って実行してみた.

irb(main):001:0> def tag(name)
irb(main):002:1>   puts "<#{name}>#{yield}</#{name}>"
irb(main):003:1> end
=> :tag
irb(main):004:0> tag(:p) {'Hello, World.'}
<p>Hello, World.</p>
=> nil
irb(main):005:0> def tag(name, &block)
irb(main):006:1>   puts "<#{name}>#{block.call}</#{name}>"
irb(main):007:1> end
=> :tag
irb(main):008:0> tag(:p) {'Hello, World.'}
<p>Hello, World.</p>
=> nil

Q8. 文法

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

def hoge(*args)
  p [ x ]
end
hoge [1, 2, 3]

以下, 実行結果.

[1, 2, 3]

上記のような結果になる為には...

  • *args
  • args[0]

以下, 解説より抜粋.

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

以下, irb で実行した結果.

irb(main):005:0> def hoge(*args)
irb(main):006:1>   p *args
irb(main):007:1> end
=> :hoge
irb(main):008:0> hoge [1, 2, 3]
[1, 2, 3]
=> [1, 2, 3]
irb(main):009:0> def hoge(*args)
irb(main):010:1>   p args[0]
irb(main):011:1> end
=> :hoge
irb(main):012:0> hoge [1, 2, 3]
[1, 2, 3]
=> [1, 2, 3]
irb(main):013:0> def hoge(*args)
irb(main):014:1>   p args
irb(main):015:1> end
=> :hoge
irb(main):016:0> hoge [1, 2, 3]
[[1, 2, 3]]
=> [[1, 2, 3]]
irb(main):017:0> hoge 1, 2, 3
[1, 2, 3]
=> [1, 2, 3]
irb(main):018:0> def hoge(*args)
irb(main):019:1>   p *args
irb(main):020:1> end
=> :hoge
irb(main):021:0> hoge 1, 2, 3
1
2
3
=> [1, 2, 3]

Q9. 文法

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

def hoge[ x ]
  puts "#{x}, #{y}, #{params[:z]}"
end

hoge 1, z: 3

実行結果.

1, 2, 3

上記のような結果となる為には...

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

以下, 解説より引用.

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

以下, irb で実行した結果.

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

ふむふむ.