2011年7月2日土曜日

rubyのメソッド引数

rubyのメソッド引数のまとめ

通常の引数

通常の引数をもつメソッド。当然ながら最も多く利用されると思われる。
def print_message message
  print "[#{message}]"
end

デフォルト値をもつ引数

デフォルト値をもつことでクライアントコードを簡略化できる。
javaでオーバーロードを行い、引数の多いメソッドに固定値を渡すパターンの場合この実装で代用することが可能。
※rubyではオーバーロードを行うことができないので、デフォルト値を持つ引数をつかって実現するほかない。
# p2を省略するとデフォルト値の0が適用される。
def m1 p1, p2 = 0
  p1 + p2
end

m1 1      # p2を省略した場合
m1 1, 2   # 明示的に指定した場合

# p1を省略するとデフォルト値の1が適用される。
def m2 p1 = 1, p2
  puts p1 + p2
end

m2 1      # p1を省略した場合
m2 1, 2   # 明示的に指定した場合

# p1を省略するとデフォルト値の1が適用される。
# p2を省略するとデフォルト値の2が適用される。
def m3 p1 = 1, p2 = 2
  puts p1 + p2
end

m3        # p1、p2を省略した場合
m3 1      # p1を省略した場合
m3 1, 2   # 明示的に指定した場合

# 引数は、左から設定されるのでp1を省略してp2のみ値を指定することはできない。

可変引数

# 可変長引数は、変数名の前に「*」をつける。
def hoge(*hoge)
  hoge.each do |val|
    puts val
  end
end

hoge("1", "2", "3")

名前付き引数

名前付き引数というのかわからないけど、引数を指定する際に名前をつけることができる。
実際には、Hashで受け渡しを行うのだけれど、RubyのHashは簡易的にインスタンス化できるので、
あたかも引数名に値を設定するかのように実装することができる。
def m(args)
  puts "p1 : #{args[:p1]}"
  puts "p2 : #{args[:p2]}"
end

m p1:"hoge", p2:["fuga1", "fuga2"]