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 源文件 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 中的默认整型)的设计决策。

by
我认为这不算是一个bug。shorts不被认为是Clojure的数值类型之一(但也存在一些互操作的支持)。
by
@alexdmiller

为什么这样?对于bytes来说很明显(它们存储数据),但对于shorts来说就不好说了。另外 '(int? (short 1))' 返回 true。
by
正如我所说,“shorts不被认为是Clojure的数值类型之一”。
by
或者,你可能想知道为什么shorts不被认为是其中的一部分——Clojure关注64位数值类型——默认是longs和doubles。在大数(BigInt/BigDecimal)之上提供了任意精度变体。出于某些原因,both java BigIntegers 和 Clojure自己的BigInt变体都受到支持(后者在范围内作为longs处理,这有点像性能优化)。Integer和shorts主要支持互操作。
...