请分享您的看法,参与2024 年 Clojure 状态调查!

欢迎!请访问关于页面获取更多关于这个工作方式的信息。

0
Clojure

使用其他整数类型索引向量时正常,只有使用 short int 类型索引时结果不正确

`
(get [1 2] (int 1))

=> 2

(get [1 2] (bigint 1))

=> 2

(get [1 2] (long 1))

=> 2

(get [1 2] (short 1))

=> nil

`

这是 bug 吗?如果不是,为什么?

1 个回答

+1

当使用类型 byte 作为索引时,不仅仅是 short 类型会返回 nil。

这种情况发生的原因是,在 Clojure 源文件 APersistentVector.java 中的 valAt 方法里,用于在 Clojure 的 PersistentVector 类中查找值,该方法会调用 clojure.lang.Util 包中的 isInteger 方法来决定索引是否为整数类型。当其参数为 java.lang.Integer、java.lang.Long、clojure.lang.BigInt 或 java.math.BigInteger 类时,该方法返回 true,对于其他类型返回 false。

我不确定这被认为是 bug,还是更可能是为了快速处理最常见的情况(java.lang.Long 是 Clojure 中的默认整数类型)而在热代码路径中做出的设计决定。

我并不认为这是 bug。shorts 不被认为是 Clojure 的数字类型之一(但对于互操作性来说有一些支持)。
@alexdmiller

为什么会有这样的原因呢?对于 bytes 来说很明确(它们存储数据),但对于 shorts 就不明确了。此外,'(int? (short 1))' 返回 true。
正如我说的,“shorts 不被认为是 Clojure 的数字类型之一”。
也许你是在问为什么 shorts 不被认为是其中的一部分——Clojure 专注于 64 位数字类型——默认使用 longs 和 doubles。在 BigInt/BigDecimal 上提供任意精度变体。因为种种原因,Java BigIntegers 和 Clojure 自身的 BigInt 变体都受到支持(后者在范围内工作时作为 longs,这是一种性能问题)。对于整数和 shorts 的支持主要是为了互操作性。
...