引数を配列として受け取る

広告

呼び出し側で指定した引数の数がメソッド定義側で指定されている引数よりも多かった場合はエラーとなります。ただメソッド定義側の最後の引数にアスタリスク(*)を付けておくと、余った引数を要素とする配列として受け取ることが可能です。書式は次の通りです。

def メソッド名(変数1, 変数2, ..., *変数n)
  実行する処理
  実行する処理
end

具体的には次のように記述します。

def printHello(msg, *names)
  print(msg + "," + name + "¥n")
end

printHello("Hello")
printHello("Hello", "Yamada")
printHello("Hello", "Yamada", "Endou")
printHello("Hello", "Yamada", "Endou", "Katou", "Takahashi")

メソッド側では引数が2つしか指定されていませんが、メソッド呼び出し側では引数を2から5個指定してメソッドを呼び出しています。この場合、メソッド側では次のように変数にオブジェクトが代入されます。

msg = "Hello";names = []
msg = "Hello";names = ["Yamada"]
msg = "Hello";names = ["Yamada", "Endou"]
msg = "Hello";names = ["Yamada", "Endou", "Katou", "Takahashi"]

メソッド側で2番目の引数に「*」が付けられていますので、呼び出し側で指定した引数の中で2番目以降の引数を要素とした配列が引数に指定されたように扱われます。注意すべき点は引数が1つだけの場合でも空の配列オブジェクトとして扱われることです。

この形式を使う場合にはメソッド側で引数に代入される配列オブジェクトの要素が決まっていませんので、それに対応した記述を行う必要があります。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test5-1.rb

#! ruby -Ku
require "kconv"

def printHello(msg, *names)
  allname = ""
  names.each do |name|
    allname << name << " "
  end
  print(Kconv.tosjis(msg + "," + allname + "¥n"))
end

printHello("こんにちは")
printHello("こんにちは", "山田")
printHello("こんにちは", "山田", "遠藤")
printHello("こんにちは", "山田", "遠藤", "加藤", "高橋")

上記のプログラムを「test5-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。

引数を配列として受け取る

( Written by Tatsuo Ikura )