.NET開発者のためのブログメディア
Rubyで複数の変数に代入できる?複数戻り値の取得方法を解説
- SE
- Rubyの変数代入がよく分かりません。教えていただけますか。
- PM
- 分かりました。Rubyの変数代入の方法を詳しく見ていきましょう。
目次
Rubyでの複数戻り値の取得について
今回は、Rubyでの複数戻り値の取得方法について説明します。Rubyには多重代入という機能があります。この機能を利用すれば、戻り値が複数ある場合、呼び元で複数の変数に代入できます。
Rubyでの複数戻り値の取得方法に興味のある方はぜひご覧ください。
多重代入とは
Rubyの多重代入とは、複数の式または配列から同時に変数に代入することです。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
val1, val2, val3 = [ 1, 2, 3 ]
puts val1 # 1
puts val2 # 2
puts val3 # 3
# []で括らなくてもよい
val4, val5, val6 = 1, 2, 3
puts val4 # 1
puts val5 # 2
puts val6 # 3
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
1
2
3
1
2
3
|
このように、複数の式または配列から同時に代入できます。
Rubyでは、関数の戻り値を複数の式または配列にして、呼び出し側で多重代入すれば、複数戻り値を代入できます。
また、多重代入については、様々な記述方法やルールがあり、代入の振る舞いが変わります。関数の複数戻り値とあわせて、詳細は以降で説明します。
複数戻り値の代入
Rubyでは、関数の戻り値を複数の式または配列にして、呼び出し側で多重代入すれば、複数戻り値を代入できます。ここからは、複数戻り値の代入の方法を説明していきます。
基本形(左辺と右辺の要素数が同じ)
左辺と右辺の要素数が同じ場合、それぞれの変数に同時に代入されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 関数定義
def get_multiple_valie
return [ 1, 2, 3 ]
end
val1, val2, val3 = get_multiple_valie()
# val1, val2, val3 = [ 1, 2, 3 ] と同じ
puts val1 # 1
puts val2 # 2
puts val3 # 3
|
実行結果は以下のようになります。
1
2
3
|
1
2
3
|
上記は左辺と右辺の要素数が一致しているシンプルなケースです。Rubyでは、左辺と右辺の要素数が一致していなくても構いません。
以降の説明では、簡略化のため、関数から配列が返却されたと仮定して、
val1, val2, val3 = [ 1, 2, 3 ] のように記述します。
左辺の変数が1つの場合は配列となる
左辺の変数が1つの場合、すべての要素を持つ配列となります。
1
2
3
4
5
6
7
8
|
# 左辺の変数が1つのみ
val1 = [ 1, 2, 3 ]
puts val1 # [ 1, 2, 3 ]
val1.each { |val| puts val } # [ 1, 2, 3 ]
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
1
2
3
1
2
3
|
配列なので、val1[0]のように、インデックスでアクセスできます。このように、左辺の変数が1つの場合、すべての要素を持つ配列となります。
左辺の要素数<�右辺の要素数の場合は残りの要素は捨てられる
左辺の要素数 < 右辺の要素数 の場合、残りの要素は捨てられます。
1
2
3
4
5
6
7
|
val1, val2 = [ 1, 2, 3 ]
puts val1 # 1
puts val2 # 2
|
実行結果は以下のようになります。
1
2
|
1
2
|
左辺の要素数 < 右辺の要素数 なので、右辺の残った要素(この場合3)は捨てられることが分かります。
左辺の要素数>右辺の要素数 の場合は残りの要素はnilになる
左辺の要素数 > 右辺の要素数 の場合、残りの要素はnilになります。
1
2
3
4
5
6
7
8
9
|
val1, val2, val3, val4 = [ 1, 2, 3 ]
puts val1 # 1
puts val2 # 2
puts val3 # 3
puts val4.nil? # true
|
実行結果は以下のようになります。
1
2
3
4
|
1
2
3
true
|
左辺の要素数 > 右辺の要素数 なので、val4はnilになることが分かります。
もちろん、戻り値が配列でない場合も、残りの要素はnilになります。
1
2
3
4
5
6
7
8
9
|
val1, val2, val3, val4 = 1
puts val1 # 1
puts val2.nil? # true
puts val3.nil? # true
puts val4.nil? # true
|
実行結果は以下のようになります。
1
2
3
4
|
1
true
true
true
|
変数に*をつけると配列変数になる
変数に*をつけると配列として取得します。
1
2
3
4
5
6
|
*val1 = [ 1, 2, 3 ]
puts val1 # [ 1, 2, 3 ]
|
実行結果は以下のようになります。
1
2
3
|
1
2
3
|
変数と配列変数を組み合わせることで、以降の要素を配列として取得します。
1
2
3
4
5
6
7
8
|
val1, *val2 = [ 1, 2, 3 ]
puts val1 # 1
puts "---"
puts val2 # [ 2, 3 ]
|
実行結果は以下のようになります。
1
2
3
4
|
1
---
2
3
|
変数と配列変数を組み合わせることで、以降の要素を配列として取得することが分かります。
残りの要素がない場合はnilではなく空配列[]になる
残りの要素がない場合は、nilではなく空配列[]になります。
1
2
3
4
5
6
7
8
|
val1, *val2 = 1
puts val1 # 1
puts "---"
puts val2.nil? # false
|
実行結果は以下のようになります。
1
2
3
|
1
---
false
|
*val2に代入する要素がないので、空配列[]になります。
配列変数は最後でなくてもよい
配列変数は最後でなくてもよくて、最初に記載することもできます。
1
2
3
4
5
6
7
8
|
*val1, val2 = [ 1, 2, 3 ]
puts val1 # [ 1, 2 ]
puts "---"
puts val2 # 3
|
実行結果は以下のようになります。
1
2
3
4
|
1
2
---
3
|
また、配列変数は中ほどに記載することもできます。
1
2
3
4
5
6
7
8
9
10
|
val1, *val2, val3 = [ 1, 2, 3, 4 ]
puts val1 # 1
puts "---"
puts val2 # [ 2, 3 ]
puts "---"
puts val3 # 4
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
1
---
2
3
---
4
|
このように、配列変数は最後でなくてもよくて、最初に記載することもできます。
配列を読み捨てる
*に変数名を付与しないと、読み捨てられます。
以下は、先頭だけ取得して以降は読み捨てるサンプルです。
1
2
3
4
5
6
7
8
9
10
|
# 先頭だけ取得して以降は読み捨てる
val1, * = [ 1, 2, 3 ]
val2, = [ 1, 2, 3 ]
puts val1 # 1
puts "---"
puts val2 # 1
|
実行結果は以下のようになります。
1
2
3
|
1
---
1
|
末尾を読み捨てる場合のみ、*を省略できます。(上記の val2 のケース)
以下は、末尾だけ取得して他は読み捨てるサンプルです。
1
2
3
4
5
6
7
8
|
# 末尾だけ取得して他は読み捨てる
*, val1 = [ 1, 2, 3 ]
# ,val2 = [ 1, 2, 3 ] # これはsyntax errorになる
puts val1 # 3
|
実行結果は以下のようになります。
1
|
3
|
以下は、先頭と末尾だけ取得して他は読み捨てるサンプルです。
1
2
3
4
5
6
7
8
|
# 先頭と末尾だけ取得して他は読み捨てる
val1, *, val2 = [ 1, 2, 3, 4 ]
puts val1 # 1
puts val2 # 4
|
実行結果は以下のようになります。
1
2
|
1
4
|
また、*は引数を読み捨てるのにも利用します。
1
2
3
4
5
6
7
8
|
def func(*)
# do something
end
func(1, 2, 3)
|
この場合、呼び元で指定した引数はすべて無視します。
配列変数の優先度は低い
左辺の要素数 > 右辺の要素数 の場合、配列変数があれば空配列になります。
1
2
3
4
5
6
7
8
9
10
11
12
|
val1, *val2, val3, val4 = [ 1, 2, 3 ]
puts val1 # 1
puts "---"
puts val2 # [] 配列の優先度は低いため、空配列になる
puts "---"
puts val3 # 2
puts "---"
puts val4 # 3
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
1
---
---
2
---
3
|
配列変数は2つ以上指定できない
配列変数を2つ以上指定すると、syntax errorとなります。
1
2
3
|
*val1, *val2 = [ 1, 2, 3 ] # syntax error, unexpected *
|
配列変数は1つまでにしましょう。
ネストした配列の要素を代入できる
括弧により、ネストした配列の要素を代入できます。
1
2
3
4
5
6
7
8
|
(val1, val2), val3 = [[ 1, 2], 3 ]
puts val1 # 1
puts val2 # 2
puts val3 # 3
|
実行結果は以下のようになります。
1
2
3
|
1
2
3
|
このように、括弧により、ネストした配列の要素を代入できます。
- SE
- Rubyの代入はとても柔軟性に富んだソースコードなんですね。
- PM
- 理解いただけたようで何よりです。複数の式から代入も可能ですので実際に書いて理解を深めていきましょう。
Rubyの戻り値に対する理解を深めよう
いかがでしたでしょうか。Rubyの多重代入を利用すれば、戻り値が複数ある場合に、呼び元で風数の変数に代入できます。
左辺と右辺の要素数の差異などで、Rubyの代入の振る舞いが変わります。ぜひご自身でRubyのソースコードを書いて、理解を深めてください。
Search キーワード検索
Popular 人気の記事
-
.NET Framework 3.5をWindows10にインストールする方法
2019年10月24日 -
EdgeとChromeはどう違う?それぞれのスペック7つを比較解説!
2020年09月28日 -
【VB.NET入門】DataGridViewの使い方まとめ
2019年12月22日 -
VB.NETをおすすめする3つの理由とは?VBAとの違いや勉強方法を解説
2019年12月21日 -
Windows10のテキストエディタおすすめ20選!選ぶポイント3つ
2020年04月28日
reccomended おすすめ記事
-
C#のusingステートメントでリソースの解放【Disposeとの違いとは】
2020年03月17日 -
【SQL Serverログの操作】トランザクションログの使用量を確認する方法
2020年03月16日 -
【.NETが統合】.NET 5の概要と今後のリリース予定
2020年03月05日
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
ソフトを用いた3DCGアート/東京都千代田区/【WEB面談可】/テレワーク
月給50万~50万円東京都千代田区(秋葉原駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅)