Как проверить, является ли ключ UUID в clojure

Я пытаюсь проверить, является ли ключевое слово UUID. Это должно выглядеть так (что не работает):

{:70342332-7f99-417a-b864-9006de62ae05 {:a 1 b: 2}} => (just {uuid? {:a 1 :b 2}})

Каковы другие способы проверить это?

Использование Midje 1.9.

2 ответа

Чистый способ архивировать то, что вам нужно, это:

(defn keyword->uuid [kw]
     (try
      (java.util.UUID/fromString (name kw))
     (catch Exception e nil)))

Если ключевое слово может быть преобразовано в объект uuid, оно будет преобразовано и возвращено (обратите внимание, что любое ненулевое возвращаемое значение истинно, поэтому вы можете использовать эту функцию как в качестве преобразователя, так и в качестве теста). В противном случае результат будет нулевым:

user=> (keyword->uuid :dasdsa)
nil
user=> (keyword->uuid :70342332-7f99-417a-b864-9006de62ae05)
#uuid "70342332-7f99-417a-b864-9006de62ae05"

Обратите внимание, что :70342332-7f99-417a-b864-9006de62ae05 это не UUID, это ключевое слово. В общем, ключевое слово в Clojure - это ключевое слово, и никак иначе, независимо от того, как выглядит строка символов.

Один из способов достичь того, что вы хотите, это взять name ключевого слова, а затем явно прочитать эту строку как UUID:

user=> (uuid? (read-string (str "#uuid \"" (name :70342332-7f99-417a-b864-9006de62ae05) "\"")))
true

Затем вы можете написать свою собственную программу проверки Midje, используя этот подход.

Другие вопросы по тегам