如何在Clojure中比较两个@字符

时间:2019-05-28 17:12:48

标签: clojure

拜托,我该怎么用clojure写这个?我有一个@字符,我想将其与"@"进行比较。

例如(= @ "@")

给出错误(ClassCastException java.lang.String cannot be cast to java.util.concurrent.Future clojure.core/deref-future (core.clj:2206))

3 个答案:

答案 0 :(得分:0)

Yoy可以使用\ @为Clojure引用@,以将其解释为字符文字。默认情况下,@是反引用表单的阅读器宏,可以使Clojure中的许多其他内容不再那么冗长。无论如何:

(= \@ \@)

true

如果要检查字符串的第一个字符是@,则:

(= \@ (first "@"))

true

以下内容仅在Clojurescript中有效,因为它没有字符类型,只使用长度为一的字符串。

(= \@ "@")

true ;; in cljs only

答案 1 :(得分:0)

此比较中存在一个固有的冲突,因为"@"是字符串的字符串序列,而\@是单个字符。如果您想确认字符串由与\@符号匹配的单个字符组成,则可以执行以下操作:

(let [s "@"]
  (and (= \@ (first s)) (= (count s) 1)))

但是,如果要检测字符串是否包含任何 \@个字符,或者它是否只是以\@字符开始,需要不同的代码。这是比较字符串和字符的问题-比较起来本质上并不明显。

答案 2 :(得分:0)

为什么会出现错误? reader将您的示例翻译为...

(= (deref "@"))

The deref function测试参数是否可引用(实现IDeref)。如果不是,它将论据视为未来。事实并非如此,因此引发了令人困惑的异常。这种行为是一个缺陷,尽管是次要的。

顺便说一下,(= x)对于任何true都会返回x,如果它返回的话。

Tim Clemons' answer显示了您可以执行的操作。