多重代入を使って複数の戻り値を取得

広告

「return」文などを使って戻り値を呼び出し側に返す場合、戻り値として返すことが出来るオブジェクトは1つだけです。ただオブジェクト自身はどのようなオブジェクトでも返すことが出来ますので配列オブジェクトを返す事もできます。

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

  return [要素1, 要素2, ...]
end

戻したいオブジェクトを要素とする配列を作成し、戻り値と指定することで結果的に複数のオブジェクトを戻り値として返すことが可能です。また上記は次のように記述することも可能です。

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

  return 要素1, 要素2, ...
end

「return」文の後に複数のオブジェクトをカンマ(,)で区切って記述すると、記述されたオブジェクトを要素として持つ配列が記述された場合と同じ扱いになります。

多重代入による受け取り

メソッドの呼び出し側では戻り値が配列オブジェクトとして帰ってきますので、いったん受け取った後で要素を取得することもできます。ただRubyでは多重代入という構文が用意されていますので、多重代入を使うことで複数の変数に一度に戻り値を代入することが出来ます。(多重代入については「多重代入」を参照して下さい)。

def keisan(num1, num2)
  return num1 + num2, num1 - num2
end

plus, minus = keisan(10, 25)

上記では「return」の次に記述された「num1 + num2」及び「num1 - num」を要素として持つ配列オブジェクトが戻り値として返されます。呼び出し元では多重代入を使って戻り値の値を変数「plus」と変数「minus」に代入しています。

このように戻り値に配列を使用することと、メソッド呼び出し側で多重代入を使用することで、複数の戻り値をメソッド呼び出し側で受け取ることが可能になります。

サンプルプログラム

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

test7-1.rb

#! ruby -Ku
require "kconv"

def keisan(num1, num2)
  print("num1 = ", num1, "¥n")
  print("num2 = ", num2, "¥n")
  return num1 + num2, num1 - num2
end

plus, minus = keisan(10, 25)
print(Kconv.tosjis("加算の結果:"), plus, "¥n")
print(Kconv.tosjis("減算の結果:"), minus, "¥n")

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

多重代入を使って複数の戻り値を取得

( Written by Tatsuo Ikura )