ฉันจะรับความยาวของอาร์เรย์ไบต์ที่ส่งคืนโดย (.getBytes string UTF-8) ได้อย่างไร

มีบางอย่างที่ฉันไม่เข้าใจเกี่ยวกับการทำงานร่วมกันของ Java ฉันมีอักขระตัวเดียว java.lang.String "x" Java Strings มีเมธอด 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 ได้อย่างถูกต้องได้อย่างไร


person Bob Kuhar    schedule 20.01.2019    source แหล่งที่มา


คำตอบ (1)


มีฟังก์ชัน alength ใน clojure.core เพื่อรับความยาวของอาร์เรย์ Java

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

เท่าที่ฉันรู้ อาร์เรย์ Java ไม่ใช่คลาสที่มีฟิลด์ชื่อ length แม้ว่าไวยากรณ์ Java myarray.length จะแนะนำเป็นอย่างอื่นก็ตาม การหาความยาวของอาเรย์ต้องใช้คำสั่งรหัสไบต์พิเศษ ไม่ใช่การเข้าถึงฟิลด์ทั่วไป นั่นเป็นสาเหตุที่ไวยากรณ์การเข้าถึงฟิลด์ interop ใน Clojure ในกรณีนี้ส่งผลให้เกิดข้อยกเว้น และด้วยเหตุผลเดียวกัน จึงจำเป็นต้องมีฟังก์ชัน alength เพื่อวัตถุประสงค์พิเศษ

person ez121sl    schedule 20.01.2019
comment
อา. นั่นมันอยู่. อาร์เรย์ Java ไม่ใช่คลาสจริงๆ ขอบคุณ - person Bob Kuhar; 20.01.2019