IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

RubyビギナーのためのStep upコラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第2回 Rubyの多重代入について (中越智哉) 2018年2月

みなさん、こんにちは。
前回はRubyのバージョンについてのお話でしたが、2018年最初のコラムである今回は、ぐっとRubyの文法にフォーカスした話題「多重代入」です。

そもそも、多重代入とは何か?というところからですね。Rubyに限らず、プログラミング言語において、「代入」はごくごく基本的な操作の一つです。代入には多くの場合、代入演算子「=」が使われ、操作としては右辺の内容が左辺に格納されます。

Rubyでは以下のように書くと、yearという変数に2018が代入されます。

year = 2018

Rubyでは、このようにちょっとした文法の確認などをしたいときに、irbという便利なツールが用意されています。もしお手元にRubyがインストールされている方は、ご一緒に試してみてはいかがでしょうか。コマンドラインから「irb」とコマンドを打つとirbが起動します。
※本稿に記載のコードの実行結果はRuby2.4で実行したものです。

fig01

割と多くのプログラミング言語では、代入演算子の左辺に記載できる変数は一つしか記載できない(代入先となる変数はひとつだけ)ので、それが当たり前と思っていた方もいらっしゃるかもしれませんね。ですが、Rubyでは「多重代入」といって、左辺に複数の変数を記載することができるのです!

ん?そうすると、右辺には複数の値を記載することができるのか?と思った方もいらっしゃるでしょう。

もちろん、下記のように書けばyearには2018、monthには1、dateには7を代入できます。

year,month,date = 2018,1,7

fig02

ちょっと意地悪な例を考えてみます。
左辺と右辺で変数と値の数が異なっていたらどうなるのでしょうか。

a,b,c = 1,2

左辺には変数が3つ、右辺には値が2つしか書かれていません。エラーになりそうな気もしますが、実行してもエラーにはなりませんでした。

fig03

このとき、変数a、b、cにはそれぞれ何が代入されたのでしょうか。irbでそれぞれの変数の内容を表示してみます。irbでは、評価結果はputsやprint、pメソッドを使わなくても表示することができます。

fig04

結果は、aが1、bが2、cはnilでした。代入する値がない変数にはnilが代入されるのです。エラーにしないでnilを代入するという動作を、余計なお世話と考えるか、気が利いていると考えるかは、もしかすると個人差があるかもしれませんが、とにもかくにもRubyではそういう仕様になっています。

そうなると、もちろん試してみたくなるのは、右辺のほうが数が多い場合ですよね。

d,e = 3,4,5

左辺には変数が2つ、右辺には値が3つあります。なんといっても、右辺の「5」がどこに代入されるのか?が関心事です。そもそも、エラーにならないかどうかも、ですね。

fig05

結果としては、これまたエラーにはなりませんでした。問題は、余った「5」がどこに行くかですが・・・。irbで確認すると以下のようになります。

fig06

余った分はどこにも代入されないという結果になりました。

さらに、右辺に関してですが、複数の値を一度に扱うといえば、配列が思い浮かびますが、配列を多重代入で用いたらどうなるのでしょうか。先ほど試したいくつかの例を、右辺を配列にして試してみましょう。

year,month,date = [2018,1,7]
a,b,c = [1,2]
d,e = [3,4,5]

irbの実行結果のキャプチャは省略しますが、どれも、[~]で囲まなかった最初の例と同じ代入結果になります。配列の各要素をそれぞれ多重代入先となる左辺に格納してくれるのですね。

ではさらに、2次元配列を右辺とした場合はどうでしょうか?

a,b,c = [1,[2,3]]

もしかしたら、bに2、cに3が入ったりしないかな?と予想した方もいるかもしれませんが、やはりbに[2,3]が入り、cにはnilが入ります。

fig07

ここまでは右辺には整数や配列などのリテラルを使ってきましたが、もちろん右辺にはメソッドの評価結果を記述することもできます。そうなると、気になってくるのが「メソッドの戻り値を一度に複数指定することはできるのか?」ということではないでしょうか。

ここは論より証拠で、そのようなメソッドを作ってみましょう。少し長くなってきますが、irbで以下のようなメソッドを定義し、その評価結果を多重代入させてみます。

def today
return 2018,1,7
end
year,month,date = today

fig08

いかにも文法確認用のメソッドという感じではありますが、普通に実行できてしまいました。todayメソッドの評価結果を見ると、returnで複数の値を「,」区切りで複数指定した場合は、これらが配列に格納されて返されるようですね。実際、today.classと実行して、classメソッドでクラス名を表示すると、「Array」となります。

fig09

メソッドの戻り値についても、多くのプログラミング言語ではreturnキーワードの後ろにかける値は一つだけ、と決められていたりしますが、Rubyの場合は、これまた気を利かせてといいますか、自動で配列に入れて返してくれるようになっているのですね。さらに、多重代入は配列にも対応していますから、メソッドの戻り値をそのまま多重代入に利用することもできるわけです。

※ただし、注意として、Rubyではメソッド内でreturnを用いなかった場合は、メソッド内で最後に評価された評価結果を戻り値とみなしますが、上記のように複数の値を「,」で区切って複数指定する記述については、returnがないとsyntax errorになってしまいます。

うまく使うと、ちょっと?かなり?便利な多重代入、皆さんも機会があれば是非ご自身のRubyプログラムでも活用してみてください。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート