Как проверить, является ли ключ 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, используя этот подход.