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

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

(Last modified: )

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

メソッドを定義するときに余った引数を要素とする配列として受け取ることができます。書式は次の通りです。

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

引数に指定した最後の変数の前に * を付けます。

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

def printHello(msg, *names)
  puts(msg + "," + names.to_s)
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 つだけの場合でも空の配列オブジェクトとして扱われることです。

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

サンプルコード

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

# encoding: UTF-8

def printHello(msg, *names)
  allname = ""
  names.each do |name|
    allname << name << " "
  end
  puts(msg + "," + allname)
end

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

下記のように実行して下さい。

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

-- --

Ruby のメソッドで引数を配列として受け取る方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。