組み込みC言語プログラマのためのmruby入門(中編) ―― mrubyをお手軽に体験する!

邑中 雅樹

tag: 組み込み

技術解説 2012年11月 7日

●条件分岐

 Rubyには,条件分岐としてif,unless,caseという3種類の制御構造があります.ifはC言語を始めとしてほとんどすべての言語に存在する,おなじみの制御構造です.

> age = 19
=> 19
> if age >= 20 then
* print "adult"
* else
* print "child"
* end
child => nil

 ageに代入されている値は20未満なので,childと表示されました.なお,行頭の*は,前の行から続いているという意味のコマンド・プロンプトです(実際には入力しない).C言語で使う波かっこ( { と } )の代わりに,thenとendを使います.また,C言語のelse ifの代わりに,Rubyではelsifというキーワードが用意されています.

 C言語には該当するものがない表記として,修飾子としてのifがあります.

> age = 30
=> 30
> print "adult" if age >= 20
adult => nil

 ifが後ろに付いて,条件が成立したときに,ifで修飾されている式(リストでは「print "adult"」の部分)が評価されます.英文法のifの使い方に近いわけですが,処理の流れが見えづらくなると言って嫌う人もいます.好き嫌いはさておき,Rubyで記述されたアプリケーションを見ているとしばしば見かける表記なので,覚えておく必要はあります.また,この表記はPerlやPythonなど,ほかの軽量言語でもしばしば見かけます.

 unlessは,ifの反対です.条件式が偽のときにthen句が評価されます.

> age = 20
=> 20
> unless age < 20 then
* print "adult"
* else
* print "child"
* end
adult => nil    # (age < 20)が成り立たないので,adult と表示される

 文法的には冗長な気もしますが,C言語のifで「!」を付け間違えるというのはよく見かけるバグです.あえてunlessという,ifと見間違えようのない文を用意するというのは,うっかりミスを少なくするという点でも意味があるのかもしれません.

 unless文はPerlにあり,Perlの影響を受けているRubyにも採用されたものと思われますが,Perlの影響を受けているPHPにはありません.使用については好みが分かれるところなのかもしれません.

 caseは,C言語のswitchに相当します.when(C言語のcase文に相当.ややこしい)には値の範囲を含む任意のオブジェクトを指定できるなど,C言語のswitchに比べると高機能です.なお,whenの中ではbreakは使えませんのでご注意ください(C言語に慣れていると,ついやってしまいがち).

> age = 0
=> 0
> case age
* when 0 #条件
* "newborn baby"
* when 1 .. 19      #範囲を指定できる
* "child"
* when nil      #数値以外の値も指定できる
* "unknown"
* else      #C言語でのdefaultラベルに相当する
* "adult"
* end

 細々とした違いはありますが,C言語に慣れている方なら,すぐに対応できるのではないかと思います.

 

●繰り返し

 Rubyにはループの制御構造としてwhile,until,forがあります.whileは,C言語の同名のものと同様に使えます.

> age = 0
=> 0
> while age < 20 do
* age += 1
* end
=> nil

> age
=> 20

 untilは,ifに対する unlessと同じように,whileの脱出条件判定の真偽が逆になっています.

> age = 0
=> 0
> until age = 20 do
* age += 1
* end
=> nil

> age
=> 20

 forは,C言語とは若干記法が異なり,「for [変数] in [与えるオブジェクト] do」となります.

> for i in 0 .. 3 do
* puts i
* end
0
1
2
3
=> 0..3

 forに与えるオブジェクトは,数値範囲に限りません.例えば配列などを与えることもできます.

> for i in ["red", "green", "blue"] do
* puts i
* end
red
green
blue
=> ["red", "green", "blue"]

 Rubyの繰り返し処理は,break,next,redoと合わせると複雑な制御構造を実現できます.breakはC言語の同名のものと同等で,nextはC言語のcontinueと同等です.redoは,ループ変数を更新せずに,for/while/until文の直後に戻ります.

 C言語にはredoに類似した機能はありません.エラー処理などで,redo相当の処理をC言語で行わせたいことがしばしばありますが,その際にはgotoを使わざるを得ないことが一般的なはずです.Rubyでは,C言語よりスマートな方法による記述が可能となります.

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日