如何比较clojure中的两个@字符
拜托,我怎么能用clojure写这个?我有一个如何比较clojure中的两个@字符,clojure,Clojure,拜托,我怎么能用clojure写这个?我有一个@字符,我想将它与“@”进行比较 例如(=@“@”) 给出错误(ClassCastException java.lang.String不能转换为java.util.concurrent.Future clojure.core/deref-Future(core.clj:2206))您可以引用@using\@将clojure解释为字符文本。默认情况下,@是一个deref表单的reader宏,用于减少clojure中的许多其他内容。无论如何: (= \@
@
字符,我想将它与“@”
进行比较
例如(=@“@”)
给出错误
(ClassCastException java.lang.String不能转换为java.util.concurrent.Future clojure.core/deref-Future(core.clj:2206))
您可以引用@using\@将clojure解释为字符文本。默认情况下,@是一个deref表单的reader宏,用于减少clojure中的许多其他内容。无论如何:
(= \@ \@)
true
如果要检查字符串的第一个字符是否为@,则:
(= \@ (first "@"))
true
以下内容仅适用于Clojurescript,因为它没有字符类型,只使用长度为1的字符串
(= \@ "@")
true ;; in cljs only
在这种比较中有一个固有的冲突,
“@”
是字符串序列,而\@
是单个字符。如果要确认字符串由与\@
符号匹配的单个字符组成,则需要执行以下操作:
(let [s "@"]
(and (= \@ (first s)) (= (count s) 1)))
但是,如果要检测字符串是否包含任何
\@
字符,或者它是否仅以\@
字符开头,则需要不同的代码。这就是比较字符串和字符的问题——从比较中所需要的内容并不明显。为什么会出现错误?将您的示例转换为
(= (deref "@"))
测试参数是否可终止引用(实现IDeref
)。如果不是,它将把这场争论视为未来。它不是,所以它抛出了令人困惑的异常。这种行为是一种缺陷,尽管是很小的缺陷
顺便说一下,(=x)
对于任何x
返回true
,如果它返回的话
显示了对此可以执行的操作。那么,您是否使用字符“@”作为绑定到某个值的符号,然后希望确保该符号具有值“@”?不管怎样,错误的原因是@是deref函数的读取器宏,该函数基本上用于等待未来的值,在代码中您试图对字符串进行deref,这是不可能的。我想说的是,你的问题需要更多的背景。别忘了德里夫访问原子等等!第二个例子(令人惊讶的一个)对我来说不是真的(在clj 1.10中)。
(=\@“@”)
为“(=\@“@”)的meas返回false:看起来你是在用clojurescript测试它,因为它没有字符类,只要长度为1的字符串,等式检查就解析为true,这并不奇怪。在clojure for jvm中,可以预见它会变为false。通过在电话上使用Fullet检查某些内容而被发现,但并不认为它是正确的。谢谢大家更新了完整的答案。