Ruby技術者認定試験のサンプル問題を解いていく ~silver編~②
githubにあるRuby技術者認定試験のサンプル問題を解説していこうと思います!
問題はこちらにありますので是非解いてみてくださいね!
解説はRuby 2.7.0 リファレンスマニュアルに準拠しています。
第二問
問題2. 以下のコードを実行した出力として正しいものを1つ選択してください。
def foo (a, *b)
p a
end
foo(1,2,3,4)
A.nil
B.1
C.エラーが発生
D.[]
E.[1]
正解はBですね。
可変長引数と呼ばれる引数の定義方法です。
それでは解説していきます。
書籍でRubyを勉強してみてもいいですね!
メソッドの定義
メソッドの定義は
def メソッド名(仮引数)
処理
end
ですが、仮引数には様々なもたせ方があります。
1. 仮引数をもたせない
仮引数をもたないメソッドを定義することができます。
def メソッド名(仮引数)
処理
end
2. デフォルト値をもつ仮引数
仮引数にデフォルト式を指定すると対応する実引数が与えられなかった場合にその式の値が引数の値として指定されます。
デフォルト値を持つ仮引数を定義した後は以降の全ての仮引数にデフォルト値を持たせるか、可変長引数(後述します)を定義する必要があることに注意が必要です。
これは、当該メソッド呼び出しの際に実引数の省略判定に影響が出るためです。
また、デフォルト式の評価は定義時ではなく呼び出し時に行われます。
例えば、$から始まるグローバル変数の値がメソッドの定義時と呼び出し時で異なる場合、呼び出された時点での値が参照されます。
def メソッド名(仮引数 = 式)
処理
end
3. 可変長引数
仮引数が*から始まる場合、残りの実引数は全て配列の要素としてその仮引数に格納されます。
可変長引数は一つのメソッドにつき一つまでしか定義できません。
例えば、i番目以降の実引数を全て無視したい場合、i番目の仮引数を単に*とすることでargumentエラーを回避できます。
def メソッド名(仮引数, *仮引数)
処理
end
def メソッド名(仮引数, *) # 2番目以降の実引数は全て無視されます。
処理
end
その他の仮引数
上記以外にも
- キーワード引数
- **から始まる仮引数
- &から始まる仮引数
などがありますが時間がないのでまたの機会に解説しようと思います!