coffeescriptで、変数lとmの2つについてswitch文で、
coffeescript
1switch l, m 2 when l is 0 and m is 変数
というような感じで条件分岐させていきたいのですが、switch l,mのようにすることはできないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
CoffeeScriptのswitch文は単純にJavaScriptのswitch文に変換されるため、JavaScriptのswitch文でできないことはできません。switch文では、対象となる式は一つのみ、そして、比較は(JavaScriptでの)===
を用いる、という原則に成り立ちます。ですので、二つの変数を持たせても、それぞれについて比較すると言うことはできません。では、[l, m]
とArrayにしてしまえばと思うかも知れませんが、JavaScriptの===
はArrayを比較するとき、要素が全て同じであっても、同一オブジェクトでなければ偽になるだめ、単純に比較することはできません。
※ RubyではArrayの比較が各要素の比較になるため、上で書いたArrayにしてしまうと言うテクニックが使えます。CoffeeScriptはRubyを参考にして設計されていますが、全く同じというわけではありません。
以上を踏まえてなんとかする方法として、一意な文字列にするという方法があります。
CoffeeScript
1l = 0 2m = "hoge" 3console.log switch JSON.stringify [l, m] 4 when JSON.stringify [0, "hoge"] 5 "0-hoge" 6 when JSON.stringify [1, "fuga"] 7 "1-fuga" 8 else 9 "other"
JSON.stringify()
でJSONにしてしまえば、配列の要素が同じであれば、同じ文字列になります。ただ、注意点として、Objectであると順番が不同になる可能性になりますので、数値、真偽値、文字列、配列でしかうまくいかないでしょう。JSON化できないオブジェクトも同様に比較できません。
もう一つの欠点として、l
が0
だけどm
が"hoge"
以外の時、という条件がこの方法ではできません。これができるようになるには、関数型プログラミングで採用されている事が多いパターンマッチという仕組みが備わっている言語でないと難しいです。たとえば、LiveScriptだと次のように書くことができます。
LiveScript
1l = 0 2m = "hoge" 3console.log match l, m 4| 0, "hoge" => "0-hoge" 5| 1, "fuga" => "1-fuga" 6| 0, _ => "0 only" 7| otherwise => "other"
LiveScriptのパターンマッチはドキュメントにすら書いていない実験的(experimental)機能ですのでご注意ください。本格的に関数型にするのであればPureScriptの方が良いかもしれません。
話は戻って、Arrayで比較の方がいいのであれば、Opalを使うという手段もあります。OpalのArrayはRubyのArrayと同じように動作します。
投稿2016/08/20 09:01
総合スコア21735
0
ベストアンサー
CoffeeScriptでは、switch
のあとの式を省略することができます。この場合、「when
の中でいちばん先にtrue
となったもの」という意味で実行されます(リファレンス)。
coffeescript
1switch 2 when l is 0 and m is 変数
投稿2016/08/20 08:47
編集2016/08/20 09:09総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。