質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1543閲覧

coffeescript switch文について。

退会済みユーザー

退会済みユーザー

総合スコア0

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/08/20 07:55

coffeescriptで、変数lとmの2つについてswitch文で、

coffeescript

1switch l, m 2 when l is 0 and m is 変数

というような感じで条件分岐させていきたいのですが、switch l,mのようにすることはできないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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化できないオブジェクトも同様に比較できません。

もう一つの欠点として、l0だけど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

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/08/20 09:10

調べれば調べるほど新たな情報が出てきた結果、回答が二転三転しています。申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問