Как получить длину байтового массива, возвращаемого (.getBytes "string" UTF-8)? - PullRequest
0 голосов
/ 20 января 2019

Есть кое-что, чего я не понимаю в Java-взаимодействии. У меня есть один символ java.lang.String "x". Строки Java имеют метод getBytes, подпись которого public byte[] getBytes(String charsetName) throws UnsupportedEncodingException: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes(java.lang.String.

Этот метод возвращает байт []. Java-массивы имеют свойство .length. Почему я получаю IllegalArgumentException в REPL?

(.length (.getBytes "x" "UTF-8"))
IllegalArgumentException No matching field found: length for class [B  clojure.lang.Reflector.getInstanceField (Reflector.java:271)

Как правильно получить длину байтового массива, возвращенного (.getBytes "x" "UTF-8") в clojure?

1 Ответ

0 голосов
/ 20 января 2019

В clojure.core есть функция alength для получения длины массивов Java

(alength (.getBytes "x" "UTF-8"))
;;=> 1

Насколько я знаю, массивы Java на самом деле не являются классами с полем с именем length,хотя синтаксис Java myarray.length предполагает иное.Получение длины массива требует специальной инструкции байтового кода, а не типичного доступа к полю.Вот почему синтаксис взаимодействия доступа к полям в Clojure в этом случае приводит к исключению.И по той же причине требуется специальная функция alength.

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