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中的默认整型类型)。

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

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