拜托,我该怎么用clojure写这个?我有一个@
字符,我想将其与"@"
进行比较。
例如(= @ "@")
给出错误(ClassCastException java.lang.String cannot be cast to java.util.concurrent.Future clojure.core/deref-future (core.clj:2206))
答案 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显示了您可以执行的操作。