如何在Clojure中初始化字节数组

13

在Clojure中创建一个字节数组,并初始化为指定的值集合,语法是什么?

类似于这样,但更实用...

(byte-array [0 1 2 3])


1
你的示例在 Clojure 的后续版本中可以工作(已在 1.8 版本中测试)。不确定更改是何时发生的。 - Phil Cooper
4个回答

15

(字节数组 (映射 字节 [0 1 2 3]))

据我所知,Clojure 没有字节字面量。


正确的;截至Clojure 1.5,它没有字节文字:http://clojure.org/reader - David J.

4

其他回答者给出了有效的解决方案。

这只是给你提供一个宏,以使你的语法更整洁,如果你需要经常这样做:

(defmacro make-byte-array [bytes] 
  `(byte-array [~@(map (fn[v] (list `byte v)) bytes)]))  

(aget (make-byte-array [1 2 3]) 2)
=> 3

2
一个函数同样可以工作,对吧?这个答案违反了宏俱乐部的第一条规则:不要编写宏! - David J.

1
(byte-array [(byte 0x00) (byte 0x01) (byte 0x02) (byte 0x03)])

1
(byte-array [(byte 0) (byte 1) (byte 2)])

说明:

byte 创建一个 byte

byte-array 创建一个 byte[]

bytes 将其转换为 byte[]


1
byte-array 创建 byte[],因此不需要调用 bytes。 - Maurits Rijk
你是对的。Repl自动装箱基本类型让我感到困惑。已经更正。 - Goran Jovic
实际上,byte 强制转换为 byte,尽管在 1.2 版本中,所有函数的参数都会自动装箱,因此 byte-array 仍然接收 Byte 并需要将其拆箱。在 1.2 REPL 中尝试 (loop [i (byte 0)] (recur (Byte. 0))) 来验证这一点。 - Michał Marczyk
好的,所以如果我使用(class (byte 1))来测试类型,它将返回java.lang.Byte,因为在传递给class函数时已经进行了装箱,尽管(byte 1)是一个原始的byte - Goran Jovic
以下代码是垃圾吗?(class (byte-array [(byte 0) (byte 1) (byte 2)])),在REPL输出中会得到奇怪的[B。 - fooledbyprimes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接