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

と書けるんならこれでいいな。いやはや、式とか文とかあまり興味ないんだけど、ちゃんと分かってないとダメだなぁ。

  1. ブレースは必ず書く派なので書いてあるだけ 

More