【问题标题】:How to correctly check if a string is equal to another string in Clojure?如何正确检查一个字符串是否等于 Clojure 中的另一个字符串?
【发布时间】:2019-04-01 17:58:35
【问题描述】:

我正在寻找更好的方法来检查 Clojure 中的两个字符串是否相等!

给定一个地图“报告”,比如

{:Result Pass}

,当我评估时

(type (:Result report))

我明白了:Java.Lang.String

为了检查:Result的值,我先尝试了

(if (= (:Result report) "Pass") (println "Pass"))

但检查失败。

所以我使用了比较方法,它有效:

(if (= 0 (compare (:Result report) "Pass")) (println "Pass"))

但是,我想知道 Clojure 中是否有与 Java 的 .equals() 方法等效的方法。或者更好的方法来做同样的事情。

【问题讨论】:

  • 请确认您发布的 Pass 不是 {:Result Pass} 中的字符串。即使是这样,您拥有的代码也应该可以工作,并且应该等同于最后一段代码。请发帖minimal reproducible example
  • (def r {:Result "Pass"}) (if (= (:Result r) "Pass") (println "Pass")) 成功打印“通过”罚款。请再试一次,因为代码没问题。
  • 你必须在字符串或其他东西中有隐藏的字符。 = 非常适合比较字符串。试试(vec (:Result report)) 看看你是否缺少任何空白。我怀疑结尾有换行符之类的。
  • 您已验证变量Pass 包含一个字符串。但它的内容是什么?
  • 每个人都有理由怀疑您声称您发布的数据是否正确,因为您一直声称type 返回Java.Lang.String,但事实并非如此:它只能返回java.lang.String。请准确地复制并粘贴您的输入,而不是转述它们。

标签: clojure


【解决方案1】:

= 是对字符串进行相等性检查的正确方法。如果它给你带来意想不到的结果,你可能在字符串中有空格,就像一个尾随换行符。

您可以使用vec 轻松检查空格:

(vec " Pass\n")

user=> [\space \P \a \s \s \newline]

【讨论】:

    【解决方案2】:

    正如@Carcigenicate 所写,使用= 来比较字符串。

    (= "hello" "hello")
    ;; => true
    

    如果您想不那么严格,请考虑在比较之前对字符串进行规范化。如果我们有前导空格,则字符串不相等。

    (= " hello" "hello")
    ;; => false
    

    然后我们可以定义一个适合我们的规范化函数。 在这种情况下,忽略前导和尾随空格和 大写。

    (require '[clojure.string :as string])
    
    (defn normalize [s]
      (string/trim
        (string/lower-case s)))
    
    (= (normalize " hellO")
       (normalize "Hello\t"))
    ;; => true
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2012-09-28
      • 2019-05-11
      • 2010-10-13
      相关资源
      最近更新 更多