请在 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 作为索引,它也会返回 nil,不仅对 short

这种情况发生的原因是,在 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主要支持互操作性。
...