Ruby

Rubyの引数いろいろ

More than 1 year has 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