如何键入提示数组?

Posted

技术标签:

【中文标题】如何键入提示数组?【英文标题】:How can I type hint an array? 【发布时间】:2011-04-12 19:43:27 【问题描述】:

我有以下记录:

(defrecord Signal [samples ^double sample-rate ^double scaling-factor])

如何将samples 指定为双精度数组?

我正在使用 clojure 1.2.0

编辑:

@dreish 在从 levand 更改后调用 (show Signal) 时,我得到以下输出:

[35] <init> (Object,double,double)
[36] <init> (Object,double,double,Object,Object)
[37] __extmap : Object
[38] __meta : Object
[39] sample_rate : double
[40] samples : Object
[41] scaling_factor : double

我知道暗示非原始类型只是为了避免反射。来自http://clojure.org/datatypes

请注意,目前非原始类型的类型提示不会用于约束字段类型或构造函数 arg,而是用于优化其在类方法中的使用

谢谢大家!

【问题讨论】:

【参考方案1】:

像这样:

(defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor])

Rich Hickey 不久前添加了这个:

为原始数组添加了特殊类型提示 - #^ints、#^floats、#^longs、#^doubles

请参阅 http://clojure.org/news 了解其工作原理。

我没有 Clojure 环境,看看这是否仍然是最好的方法。我假设 #^ 语法已更新为 ^ 以及 1.2 中 Clojure 中的所有其他类型提示

编辑:关于它的另一篇博文:http://asymmetrical-view.com/2009/07/02/clojure-primitive-arrays.html

【讨论】:

【参考方案2】:

我同意 levand 关于使用哪种类型提示的回答,但您可能想检查 defrecord 是否实际使用这些类型提示。在我的安装(也是 1.2.0)上,它没有。

user=> (defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor])
user.Signal
user=> (use '[clojure.contrib.repl-utils :only [show]])    
nil
user=> (show Signal)
===  public final user.Signal  ===

[stuff deleted]

[38] <init> (Object,Object,Object)
[39] __extmap : Object
[40] __meta : Object
[41] sample_rate : Object
[42] samples : Object
[43] scaling_factor : Object

[more stuff deleted]

如您所见,构造函数参数(38)和成员变量(41-43)仍然只是Objects。 (无论如何,数组都是引用,但是一旦实现了该功能,有一天能够将未装箱的数字存储在记录中会很好。)

【讨论】:

【参考方案3】:

详细说明 dreish 写的内容:

正如当前实现的 (1.2),类型提示不会在 API 中体现(实例变量、构造函数/方法签名),而是用于消除词法范围内的反射调用。例如:

用户=>(设置!*warn-on-reflection* true) 真的 用户=> (defprotocol P (foo [p])) 磷 用户=> (defrecord R [n] P (foo [_] (.intValue n))) 反射警告,NO_SOURCE_PATH:4 - 无法解析对字段 intValue 的引用。 用户.R 用户=> (defrecord R [^Number n] P (foo [_] (.intValue n))) 用户.R

剩下的问题是原始数字的装箱,尽管双数组 is-a 对象,所以不用担心。

也就是说,我相信 master 分支 (1.3) 中有一些增强功能,例如实例变量等可以基于类型提示作为原始类型发出。

【讨论】:

以上是关于如何键入提示数组?的主要内容,如果未能解决你的问题,请参考以下文章

PHPStorm 类型提示不同类型的数组

如何键入具有相应类型的元组数组?

如何从 rxjs 6 withLatestFrom 键入数组映射参数

如何使用 Typescript 在 mongoose 中正确键入对象 ID 数组

如何使用 Typescript 在 mongoose 中正确键入对象 ID 数组

如何在 TypeScript 中键入带有类的数组?