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

`

这是一个错误吗?如果不是,原因是什么?

1 个答案

+1

如果您使用类型byte作为索引,它也会返回nil,这不仅限于short

这种情况发生的原因是,Clojure中PersistentVector类的源文件APersistentVector.java中的valAt方法,用于在Clojure的PersistentVector类中查找值,调用了clojure.lang.Util包中的isInteger方法,以确定索引是否为整数类型。如果该方法的参数是java.lang.Integer、java.lang.Long、clojure.lang.BigInt或java.math.BigInteger类之一,则返回true,否则返回false。

我不知道这被认为是错误,还是更有可能是一种设计决定,即在快速代码路径中快速处理最常见的用例(java.lang.Long是Clojure中的默认整数类型)。

我不认为这是一个错误。shorts 不是 Clojure 的数值类型之一(但存在一些互相操作的支持)。
@alexdmiller

为什么会这样?对于 bytes 很明显(它们存储数据),但对于 shorts 来说不是。而且 '(int? (short 1))' 返回 true。
正如我所说,“shorts 不被考虑为 Clojure 的数值类型之一”。
或者你可能想知道为什么 shorts 不被视为其中的一部分 - Clojure 关注 64 位数值类型 - 默认为 longs 和 doubles。在 BigInt/BigDecimal 之上提供任意精度变体。由于某些原因,既支持 java BigIntegers,也支持 Clojure 自身的 BigInt 变体(后者在范围内以 longs 的形式工作,这是一种性能问题)。支持 integers 和 shorts 主要是为了互相操作。
...