Posted at

Rubyの引数いろいろ

More than 3 years have passed since last update.

Rubyの引数について色々あるけど知らなかったので調べてみた。


普通の引数

class Hoge

def self.piyo(msg)
p msg
end
end

Hoge.piyo('fuga') #=> 'fuga'


デフォルト引数

引数にデフォルト値をもたせられる。

実行時に引数を渡さなかった場合、デフォルト引数を用いて処理が行われる。

def self.piyo(msg='fuga')

p msg
end

Hoge.piyo #=> 'huga'

Hoge.piyo('fugafuga') #=> 'fugafuga'


キーワード引数

hashを使った引数宣言もできる。

実行時にkeyを宣言しないとエラるので注意。

def self.piyo(msg: 'fuga')

p msg
end

Hoge.piyo  # =>'fuga'

Hoge.piyo(msg: 'fugafuga') #=> 'fugafuga'

キーワード引数は複数の引数を使う時に便利。

Hashなので引数の順番を気にせず使える。

def self.piyo(msg: 'hello', name: 'Yamada')

p "#{msg}, #{name}"
end

Hoge.piyo #=>"hello, Yamada"

Hoge.piyo(msg: 'Hi', name: 'Sato') #=> "Hi, Sato"
Hoge.piyo( name: 'Sato', msg: 'Hi') #=> "Hi, Sato"

ただし、定義していないkeyを使おうとするとエラる。

Hoge.piyo(gender: 'male') 

# => ArgumentError: unknown keyword: gender from (pry):23:in `<main>'


可変長引数&オプション引数

*をつければ引数を複数個設定できる。

これを可変長引数という。

引数は配列として受け取られる。

def self.piyo(*msg)

p msg
end

Hoge.piyo('fuga') # => ['huga']

Hoge.piyo('huga', 'hugahuga') #=> ['fuga', 'fugafuga']

*を2つつけるとオプション引数になる。

オプション引数はHashとして受け取られる。

def self.piyo(**msg)

p msg
end

Hoge.piyo(msg: 'fuga') # => {:msg => 'huga'}

Hoge.piyo(msg: 'huga', name: 'hugahuga')
#=> { :msg => 'fuga', :name => 'fugafuga' }


ブロック引数

blockも引数として渡せる。

block.callでメソッド内で実行する。

def self.piyo(&block)

block.call
end

Hoge.piyo{ p 'fuga' } # => 'fuga'

yieldの方がよく使う気がする。

使い方&結果は一個上と同じ。

def self.piyo

yield
end