引数には種類があって、区別できていなかったので基本的なことを整理する。
引数
定義における値の受け渡しの基本
def メソッド名(仮引数) # メソッドの定義
式...
end
メソッド名(実引数) # メソッドの呼び出し
仮引数
メソッド定義において、メソッド呼び出しで与えられた実引数を受け取る変数。
スコープはローカル変数と同じで再代入できる。
仮引数に代入を行っても呼び出し側には影響を与えない。
仮引数にデフォルト式が与えられた場合は、実引数の省略時にデフォルト値となる。
def foo(par = 'hoge') #デフォルト式(=)、値('hoge')
puts par
end
foo #実引数を省略した時
#=> "hoge"
foo(bar) #実引数を明示した時
#=> "bar"
実引数
メソッド呼び出しにおいてメソッドに与えられる値。
実引数には式を与える
全ての式が評価されてからメソッドが呼び出される。
キーワード引数
キーワードによって特定される引数。
ハッシュ形式で引数を設定できる。
呼び出しは、「シンボル:値」の形式で指定する。
デフォルト値が設定されている場合は実引数を省略できる。
定義時にデフォルト値の指定がなければ実引数を省略するとエラーになる。
def person(name: 'taro', age: '20' )
puts "#{name}, #{age}"
end
person
#=> "taro, 20"
person(name: 'hana', age:)
#=> "hana, 20"
person(country: 'japan')
#=> ArgumentError (unknown keyword: country)
可変長引数(rest引数)
*仮引数名で、複数の引数を設定できる。
引数は配列として格納される。
def foo(x, *xs)
puts "#{x}:#{xs.inspect}" # inspectは、オブジェクトや配列を分かりやすく返すメソッド。
end
foo(1) #=>1:[]
foo(1,2) #=>1:[2]
foo(1,2,3) #=>1:[2,3]
オプション引数
**仮引数名で、可変長引数と同じように制限なく引数を設定できる。
キーを引数として渡すことができる。
ハッシュ形式で値を扱う。
def foo(**bar)
puts bar
end
foo
#=> {}
foo(key1: '1', key2: '2')
#=> {:key=>"1", :key2=> "2" }
ブロック引数
&仮引数名でブロックを引数として受け取ることができる。
def foo(cnt, &block_arg)
cnt.times { block_arg.call }
end
#.timesは、繰り返し処理を行うメソッド
#.callは、ブロックを呼び出すメソッド
foo(3) { print "Ruby!" } # {}ブロックの部分
#=> Ruby!Ruby!Ruby!
Ruby 2.3.0 リファレンスマニュアル > クラス/メソッドの定義
プロを目指す人のためのRuby入門/著者:伊藤淳一