Racket 似乎有两种机制可以将每种类型的信息添加到结构中: generics
和 properties
.不幸的是,文档似乎没有表明何时首选一个。文档确实说:
Generic Interfaces provide a high-level API on top of structure type properties.
但是当我应该使用另一个时,这似乎并没有提供一个很好的直觉。
define-generic
似乎很清楚提供比 make-struct-type-property
更高级别的接口(interface).但是许多结构类型仍然只使用属性,这似乎表明仍然存在首选低级 API 的情况。所以问题是,什么时候使用结构属性系统比使用泛型更好,或者属性库仅作为历史遗迹存在?
最佳答案
struct 属性系统是通用接口(interface)库的实现策略,因此不被弃用。它或类似的东西是使通用接口(interface)工作所必需的。并非所有结构属性的使用都作为通用接口(interface)有意义。
也就是说,对于许多典型用例,define-generic
形式是首选。作为 #:methods
form for structs 建议,它对于以面向对象的方式组织并具有基于接口(interface)的调度的代码很有用。这方面的例子包括序列( gen:sequence
来自 data/collection
)和字典( gen:dict
)。
Racket 代码库中的普通结构属性通常用于某些数据只需要作为元数据存储在结构中,或者只有一个“方法”并且使用起来不必要的复杂 define-generic
,或者当界面比“在这里放一个程序”更复杂时。示例包括 prop:procedure
或 prop:evt
.
关于methods - Racket 中的结构属性与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225445/