2011/02/17

Rubyの面白いところ Part 11 「caseとbreakは他言語と動作が異なる」

breakはもっとも内側のループを脱出します。ループとは

  • while
  • until
  • for
  • イテレータ
のいずれかを指します。 C言語とは異なり、breakはループを脱出する作用だけを持ち、caseを抜ける作用は持ちません。(参考)

ほっほー。試しに下記を実行するとfirstが出力された。つまり、2つ目からのwhenはifではなくelse ifなんですね。

a = 1
case a
when 1
  p "first"
when 1
  p "second" # never come here
else
  p "else" # never come here
end

2011/05/11 追記:
動物本を見るとelse ifという表現はあまりよろしくない気がしました。

プログラミング言語 Rubyより

他の言語のswitch文は、単純に適切なcaseラベルの先頭に制御を移すだけである。そこから制御は継続され、他のcaseラベルに「落下」することもある。この落下の動作により、複数のcase節が同じコードブロックを参照できるのである。Rubyでは、個々のwhen節にカンマ区切りの複数の指揮を並べられるようにして、同じ目的を達している。Rubyのcase文は落下しない。

プログラミング言語 Ruby 第2版 131ページ caseとswitch
def hasValue?(x)      # hasValue?という名前のメソッドを定義する
  case x              # xの値に基づく多方向条件分岐
  when nil, [], "", 0 # nil===x || []===x || ""===x || 0===xなら
    false             # メソッドの戻り値はfalse
  else                # そうでなければ
    true              # メソッドの戻り値はtrue
  end
end

0 件のコメント: