10

ドクターcase曰く

cond や condp とは異なり、case は一定時間のディスパッチを行います... case ではあらゆる種類の定数式が受け入れられます。

caseの定数時間ディスパッチを利用して、Java 列挙型に一致させたいと考えています。Java のswitchステートメントは列挙型でうまく機能しますが、Clojure では次のようにします。

(defn foo [x] 
   (case x 
      java.util.concurrent.TimeUnit/MILLISECONDS "yes!"))

(foo java.util.concurrent.TimeUnit/MILLISECONDS)

結果:IllegalArgumentException No matching clause: MILLISECONDS

では列挙型はサポートされていませんcaseか? 私は何か間違ったことをしていますか?頼る必要condがありますか、それともより良い解決策がありますか?

4

3 に答える 3

6

列挙型の名前に cond を使用できます

(case (.name myEnumValue) "NAME_MY_ENUM" (println "Hey, it works!"))

代替案と比較して、私には非常に単純に思えます

于 2014-08-09T08:24:40.527 に答える
0

ケースの等価性チェックを使用するだけの簡単なソリューションを次に示します-

(defn cases [v & args]
  (let [clauses (partition 2 2 args)]
    (some #(when (= (first %) v) (second %)) clauses))) 

=> (cases EventType/received EventType/send "A" EventType/received "B")
=> "B"
于 2015-05-20T18:49:43.907 に答える