Как правильно проверить, равна ли строка другой строке в Clojure? - PullRequest
0 голосов
/ 01 апреля 2019

Я ищу более эффективные способы проверить, равны ли две строки в Clojure!

При заданном «отчете» карты, например

{:Result Pass}

, при оценке

(type (:Result report))

Я получаю: Java.Lang.String

Чтобы написать проверку на значение :Result, я сначала попытался

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

Но проверка не удалась.

Поэтому я использовал метод сравнения, который сработал:

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

Однако мне было интересно, есть ли что-нибудь, эквивалентное Java .equals() методу в Clojure.Или лучший способ сделать то же самое.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

= - это правильный способ проверки равенства строк.Если он дает неожиданные результаты, у вас, вероятно, есть пробелы в строке, такие как завершающий символ новой строки.

Вы можете легко проверить пробелы, используя vec:

(vec " Pass\n")

user=> [\space \P \a \s \s \newline]
1 голос
/ 02 апреля 2019

Как писал @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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...