From: "M.Fujii" Date: 2007-06-20T23:47:40+09:00 Subject: [ruby-list:43642] Re: case when 〜 end 構文での and/or/not 演算子について 藤井です。 From: Nobuyoshi Nakada 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