基礎

Rubyの可変長引数入門|*(スプラット演算子)の使い方

可変長引数を使うと、メソッドに渡す引数の数を柔軟に変更できます。Rubyでは*(スプラット演算子)を引数名の前に付けることで、任意の個数の引数を配列として受け取ることができます。引数の数が事前に決まっていない場合に非常に便利な機能です。

基本的な使い方

引数名の前に*を付けると、渡された引数がすべて配列として受け取れます。

Ruby
def greet(*names)
  names.each do |name|
    puts "こんにちは、#{name}さん!"
  end
end

greet('太郎')
puts '---'
greet('太郎', '花子', '次郎')
実行結果
こんにちは、太郎さん!
---
こんにちは、太郎さん!
こんにちは、花子さん!
こんにちは、次郎さん!

*namesで受け取った引数は配列になるため、eachで繰り返し処理したり、lengthで個数を確認できます。引数を1つも渡さない場合は空の配列になります。

通常の引数と組み合わせる

可変長引数は通常の引数と組み合わせて使えます。

Ruby
def sum(label, *numbers)
  total = numbers.sum
  puts "#{label}: #{numbers.join(' + ')} = #{total}"
end

sum('合計', 1, 2, 3)
sum('合計', 10, 20, 30, 40, 50)
実行結果
合計: 1 + 2 + 3 = 6
合計: 10 + 20 + 30 + 40 + 50 = 150

最初の引数はlabelに代入され、残りのすべての引数がnumbers配列に入ります。可変長引数は通常の引数の後に配置するのが一般的です。

ダブルスプラット(**)でハッシュを受け取る

**(ダブルスプラット)を使うと、キーワード引数をハッシュとして受け取れます。

Ruby
def create_user(name, **options)
  puts "名前: #{name}"
  options.each do |key, value|
    puts "  #{key}: #{value}"
  end
end

create_user('太郎', age: 25, city: '東京')
puts '---'
create_user('花子', age: 22, email: 'hanako@example.com', role: 'admin')
実行結果
名前: 太郎
  age: 25
  city: 東京
---
名前: 花子
  age: 22
  email: hanako@example.com
  role: admin

スプラット演算子で配列を展開

*はメソッド呼び出し時に配列を展開する目的でも使えます。

Ruby
def add(a, b, c)
  a + b + c
end

numbers = [10, 20, 30]
result = add(*numbers)  # 配列を展開して引数に渡す
puts "合計: #{result}"
実行結果
合計: 60

実践的な使い方

Ruby
# ログ出力メソッド
def log(level, *messages)
  timestamp = '2026-02-19 10:30:00'
  messages.each do |msg|
    puts "[#{timestamp}] [#{level.upcase}] #{msg}"
  end
end

log('info', 'アプリケーション起動')
log('warn', 'メモリ使用量が80%を超えました', 'ディスク容量が少なくなっています')
log('error', 'データベース接続エラー')

puts '---'

# 統計計算メソッド
def statistics(*values)
  return puts '値がありません' if values.empty?

  puts "データ: #{values.inspect}"
  puts "個数: #{values.length}"
  puts "合計: #{values.sum}"
  puts "平均: #{(values.sum.to_f / values.length).round(1)}"
  puts "最大: #{values.max}"
  puts "最小: #{values.min}"
end

statistics(85, 92, 78, 95, 67)
実行結果
[2026-02-19 10:30:00] [INFO] アプリケーション起動
[2026-02-19 10:30:00] [WARN] メモリ使用量が80%を超えました
[2026-02-19 10:30:00] [WARN] ディスク容量が少なくなっています
[2026-02-19 10:30:00] [ERROR] データベース接続エラー
---
データ: [85, 92, 78, 95, 67]
個数: 5
合計: 417
平均: 83.4
最大: 95
最小: 67
*と**の使い分け

*argsは位置引数を配列で受け取り、**kwargsはキーワード引数をハッシュで受け取ります。両方を組み合わせることで、あらゆる形式の引数を受け入れる柔軟なメソッドが作れます。

可変長引数の位置に注意

可変長引数(*args)はメソッド定義の中で1つだけ使えます。通常の引数の後、キーワード引数の前に配置してください。def method(a, *b, **c)のような順序が正しい形です。

まとめ

  • *引数名で任意の個数の引数を配列として受け取れる
  • **引数名でキーワード引数をハッシュとして受け取れる
  • 通常の引数と可変長引数は組み合わせて使える
  • メソッド呼び出し時の*配列で配列を展開して引数に渡せる
  • 引数の数が不定のメソッドを作る際に非常に便利