[ruby-list:43642] Re: case when 〜 end 構文での and/or/not 演算子について

From: "M.Fujii" <boochang@...4.kcn.ne.jp>
Date: 2007-06-20 14:47:40 UTC
List: ruby-list #43642
藤井です。

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
Subject: [ruby-list:43641] Re: case when 〜 end 構文での and/or/not 演算子について
Date: Wed, 20 Jun 2007 22:26:02 +0900
> At Wed, 20 Jun 2007 20:15:29 +0900,
> M.Fujii wrote in [ruby-list:43640]:
> > case 後の式を省略しない場合は when の後に複数の式を書ける構文はなくせな
> > いのはその通りだと思います。以下のようにするのはどうでしょうか?
> > 
> >   - case の後に式がくる場合の when 節の構文は従来通り
> >   - case の後の式を省略した場合の when 節の構文を見直す
> >     (こちらの場合では when 節に式を列挙できることに対する必要性は少ない
> >     と思います)
> 
> 変更自体は簡単ですが、そうする必要性はなんでしょうか。

まず確認させてください。

私は以下の if 〜 end の式(式 A)と、case when 〜 end の式(式B)が等価であ
り、また、こういう書き換えが可能になるように case の後の式を省略する構
文が導入されていると思っているのですが、それは正しいのでしょうか?

# これが間違っているのなら変更の必要性はまったくありません。正しいので
# あれば、等価のようでありながら微妙に違う点を修正するという点で意味の
# ある変更だと思います。

# 式 A
if cond1
  expr1
elsif cond2
  expr2
else
  expr3
end

# 式 B
case
when cond1
  expr1
when cond2
  expr2
else
  expr3
end

式 A と式 B が等価であれば、私は以下の式 C は case when 〜 end を構文を
用いて等価な式 D が書けると思いました。
しかし、実際には式 D は構文エラーとなります。

# 式 C
if cond10
  expr10
elsif cond20 and cond30 # 条件式に and 演算子が含まれる
  expr20
else
  expr30
end

# 式 D
case
when cond10
  expr10
when cond20 and cond30 # 条件式に and 演算子が含まれる
  expr20
else
  expr30
end

そこで、式 D が受理されないのならばどうするのか? case when 〜 end でど
う記述するのが Ruby 的なのか?あるいは、そもそも Ruby ではそういう用途
で case when 〜 end を用いるべきではない、というのが正しいのか?
というのが知りたかったので最初の質問をさせていただきました。

>  (1) and, or, not の使用を避け、&&, ||, ! を使用する。
>  (2) "when (a and b)" のように括弧を適用する。
>  (3) case when 〜 end のような構文を使わず、普通に if 〜 elsif 〜 end
>      を用いる。
>  (4) 上記以外の何か。

(1) では式 C 相当の処理を case when 〜 end で式 E のスタイルで記述する
    ことになります。

(2) では式 C 相当の処理を case when 〜 end で式 F のスタイルで記述する
    ことになります。

(3) では式 C 相当の処理を記述するのは、無理して case を使わず、式 C の
    のように if のままでいいではないか?ということになります。

# 式 E
case
when cond10
  expr10
when cond20 && cond30    # and 演算子ではなく && 演算子を用いる
  expr20
else
  expr30
end

# 式 F
case
when cond10
  expr10
when (cond20 and cond30) # 条件式に and 演算子が含まれる場合は括弧で囲う
  expr20
else
  expr30
end

そして、case when 〜 end 構文が if 〜 elsif 〜 end 構文の代替となる存在
であるのなら、case の後の式を省略した場合には上記の "when cond20 and
cond30" のようなコードが許した方が良いのではないかと思い以下の要望の書
き足した次第です。

> また、"when a and b" のような記述が受理されるように構文を見直していただ
> ければ幸いです。

--
藤井 正行 / Masayuki FUJII


In This Thread