methods - Racket 中的结构属性与泛型

标签 methods struct racket

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/

相关文章:

racket - 如何接受拖放到 Racket Canvas 上的剪贴板数据

c++ - 无法在静态方法中访问私有(private)类成员?

C 常量结构,在堆栈上包含不同长度的数组

javascript - 在 Javascript 中调用对象方法

swift - 从 tableView 中删除 StructItem

C 使用 typedef 或 #define 定义结构

recursion - 删除方案中的子序列函数(深度递归)

algorithm - 二叉树中序遍历Racket

c++ - 将内联方法从头文件移动到 .cpp 文件

java - 许多Java集合都实现了add方法——它们实际上是深复制