Rubyのif式で気づいたこと
安心してください。とても今さらな話です。
jpmobile を読んでいたら if も式だと
今日 jpmoile 1.0.0.pre を読んでいてふと
lib/jpmobile/mailer.rb
@mobile = if tos.size == 1
# for mobile
(Jpmobile::Email.detect(tos.first) || Jpmobile::Mobile::AbstractMobile).new(nil, nil)
else
# for multi to addresses
Jpmobile::Mobile::AbstractMobile.new(nil, nil)
end
こんなコードが目に留まった。
あーそうか。
Rubyは制御構造も式です
ってこういうことか。あまり意識してなかった。式とか文とか普段あまり意識してなくて、
基本的には値が返るので return を省略できる
程度にしか覚えてなかった。
Ruby は条件演算子をかっこよく書けないけど問題にならない
※ 実際に気づいたのは 4/5 のこと。
PHP を書いているときによく
function funk() {
return ( condition )
? val1
: val2;
}
と、いわゆる三項演算子、厳密には条件演算子を使って if 文を書かずに済むなら書かないようにしていた。そうでないと
function func() {
if ( condition ) {
return val1;
} else {
return val2;
}
}
と書かねばならず1、とても記述量が増えてしまうから。後置 if も使えないし、とにかく短く書けない PHP での必死の抵抗として条件演算子にはとてもお世話になっている。この場合は単に return するだけなのでそうでもないが、例えば
var = ( condition )
? val1
: val2
となると、もはや条件演算子を使わずにスッキリ書くなど不可能と言ってよい。
ところが Ruby では逆にこの条件演算子を気持ちよく書きにくい。というのも
? を次の行に下ろすことができない
から。なんと syntax error になるのだ。そうすると
( condition ) ?
val1 :
val2
こう書くのか。しかしこれではとても読みやすいとは言えない。実はこれずーーっと困ったなぁ思っていたんだけど、上のように
var = if ( condiition )
val1
else
val2
end
と書けるんならこれでいいな。いやはや、式とか文とかあまり興味ないんだけど、ちゃんと分かってないとダメだなぁ。
ブレースは必ず書く派なので書いてあるだけ ↩