OS: Microsoft Windows XP Home Edition Version 2002 Service Pack 3


C:\>uname -mrsv
WindowsNT 1 5 x86
 
C:\>ruby -v
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]

可変長引数のサンプルコード。


# 可変長引数(残余引数: 任意の数の引数を取ることができる)
def hoge1(*args)
  args.each_index{|i|
    puts "args[#{i}]=#{args[i]}"
  }
end
 
puts '----- hoge1 begins -----'
hoge1('hello', 'my', 'friend', 'you', 'love', 'summer', 'attane!')
puts '----- hoge1 finished -----'

実行結果。変数が自動的に配列になる。


C:\>ruby zanyo1.rb
----- hoge1 begins -----
args[0]=hello
args[1]=my
args[2]=friend
args[3]=you
args[4]=love
args[5]=summer
args[6]=attane!
----- hoge1 finished -----

可変長引数のサンプルコードもうひとつ。


# 必須引数とオプション引数(引数のデフォルト値を設定)と可変長引数
def hoge2(arg1, arg2 = '', *args)
  puts "arg1=#{arg1}"
  puts "arg2=#{arg2}"
  args.each_index{|i|
    puts "args[#{i}]=#{args[i]}"
  }
end
 
puts '----- hoge2 begins -----'
hoge2('hello', 'my', 'friend', 'you', 'love', 'summer', 'attane!')
puts '----- hoge2 finished -----'
 
puts '----- hoge2 begins -----'
array = ['hello', 'my', 'friend', 'you', 'love', 'summer', 'attane!']
hoge2(*array) # 配列の変数名の前にアスタリスク(*)をつける
puts '----- hoge2 finished -----'

実行結果。
配列の変数名の前にアスタリスク(*)つけると自動的に引数に合わせて分解してくれる。


C:\>ruby zanyo2.rb
----- hoge2 begins -----
arg1=hello
arg2=my
args[0]=friend
args[1]=you
args[2]=love
args[3]=summer
args[4]=attane!
----- hoge2 finished -----
----- hoge2 begins -----
arg1=hello
arg2=my
args[0]=friend
args[1]=you
args[2]=love
args[3]=summer
args[4]=attane!
----- hoge2 finished -----

ハッシュで擬似的なキーワード引数のサンプルコード。


# ハッシュで擬似的なキーワード引数
def hoge1(arg1, options={})
  values = {'name' => 'anonymous', 'sex' => 'not known'}
  values.merge!(options)
  puts "arg1=#{arg1}"
  values.each{|k,v|
    puts "#{k}=#{v}"
  }
end
 
puts '----- hoge1 begins -----'
hoge1('hello', { 'name' => 'Alice' })
puts '----- hoge1 finished -----'
 
puts '----- hoge1 begins -----'
# 自動でハッシュに束ねられる引数
hoge1('hello', 'name' => 'Alice', 'sex' => 'Female', 'age' => 12)
puts '----- hoge1 finished -----'

実行結果。
末尾は自動でハッシュに束ねられる。


C:\>ruby keyword.rb
----- hoge1 begins -----
arg1=hello
name=Alice
sex=not known
----- hoge1 finished -----
----- hoge1 begins -----
arg1=hello
name=Alice
sex=Female
age=12
----- hoge1 finished -----

オプション引数と擬似キーワード引数を混ぜるサンプルコード。


# 混ぜるな危険
 
def hoge1(arg1, opt = 'XXX', hash = {})
  puts "arg1=#{arg1}"
  puts "opt=#{opt}"
  hash.each{|k,v|
    puts "#{k}=#{v}"
  }
end
 
puts '----- hoge1 begins -----'
hoge1('hello', 'my', 'name' => 'Alice', 'sex' => 'Female', 'age' => 12)
puts '----- hoge1 finished -----'
 
puts '----- hoge1 begins -----'
hoge1('hello', 'name' => 'Alice', 'sex' => 'Female', 'age' => 12)
puts '----- hoge1 finished -----'

実行結果。
オプション引数とハッシュがウガウガしちゃう。


C:\>ruby mazerunakiken1.rb
----- hoge1 begins -----
arg1=hello
opt=my
name=Alice
sex=Female
age=12
----- hoge1 finished -----
----- hoge1 begins -----
arg1=hello
opt={"name"=>"Alice", "sex"=>"Female", "age"=>12}
----- hoge1 finished -----

擬似キーワード引数と可変長引数を混ぜるサンプルコード。


# 混ぜるな危険
 
def hoge2(arg1, hash = {}, *args)
  puts "arg1=#{arg1}"
  hash.each{|k,v|
    puts "#{k}=#{v}"
  }
  args.each_index{|i|
    puts "args[#{i}]=#{args[i]}"
  }
end
 
puts '----- hoge2 begins -----'
hoge2('hello', 'name' => 'Alice', 'sex' => 'Female', 'age' => 12)
puts '----- hoge2 finished -----'
 
puts '----- hoge2 begins -----'
hoge2('hello', {'name' => 'Alice', 'sex' => 'Female', 'age' => 12}, 'my', 'friend')
puts '----- hoge2 finished -----'

実行結果。
末尾がハッシュならまだしも、可変長引数を最後にもってくるのはまずいみたい。
3つめの可変長引数を使うには、2つめの引数をちゃんとハッシュで渡さないとコケる。


C:\>ruby mazerunakiken2.rb
----- hoge2 begins -----
arg1=hello
name=Alice
sex=Female
age=12
----- hoge2 finished -----
----- hoge2 begins -----
arg1=hello
name=Alice
sex=Female
age=12
args[0]=my
args[1]=friend
----- hoge2 finished -----

可変長引数と擬似キーワード引数を混ぜるサンプルコード。


# 混ぜるな危険
 
def hoge3(arg1, *args, hash)
  puts "arg1=#{arg1}"
  args.each_index{|i|
    puts "args[#{i}]=#{args[i]}"
  }
  hash.each{|k,v|
    puts "#{k}=#{v}"
  }
end
 
puts '----- hoge3 begins -----'
hoge3('hello', 'my', 'friend', 'name' => 'Alice', 'sex' => 'Female', 'age' => 12)
puts '----- hoge3 finished -----'

実行結果。
可変長引数がちゃんと使えるし、末尾もハッシュに束ねられる。


C:\>ruby mazerunakiken3.rb
----- hoge3 begins -----
arg1=hello
args[0]=my
args[1]=friend
name=Alice
sex=Female
age=12
----- hoge3 finished -----

まぁ、わかりにくくなるからあんまり混ぜないほうが良さそう。。。

tags: ruby

Posted by NI-Lab. (@nilab)