Как проверить, является ли объект clojure байтовым массивом?
Как написать функцию bytes?
, которая возвращает следующее:
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
Ответы
Ответ 1
(defn bytes? [x]
(if (nil? x)
false
(= (Class/forName "[B")
(.getClass x))))
Обновление. Здесь уже задан тот же вопрос Проверка того, является ли объект примитивным массивом Java в Clojure. И google дает именно эту страницу на ваш вопрос "как проверить, является ли объект clojure байтовым массивом?";)
Ответ 2
То, как я это делал до сих пор, создавал массив этого типа и тестировал его класс. Чтобы предотвратить создание ненужного экземпляра каждый раз, создайте функцию, которая закрывается над классом этого конкретного типа массива.
(defn test-array
[t]
(let [check (type (t []))]
(fn [arg] (instance? check arg))))
(def byte-array?
(test-array byte-array))
=> (byte-array? (byte-array 8))
true
=> (byte-array? [1 2 3])
false
Пример Mobyte кажется намного проще, хотя, похоже, у меня будет некоторый рефакторинг, где я использовал это:)
Ответ 3
Clojure.core версии 1.9 и выше поддерживает bytes?
функция. Здесь ссылка Clojuredocs