欢迎!请查看 关于 页面,获取更多有关此如何工作的信息。
在使用信道时,例如在处理 http 响体流时,如果有一个 chan? 函数可以检查给定的 var 是否是一个信道,那就将非常有帮助。
Aleph 已经在其 http-server/client 实现中,使用 lamina 信道这样做,感觉相当一致。
当然,为基本对象提供一个类型检查函数也与 Clojure 的其他部分更协调。
由 jwr 发表的评论
我已经到了需要指定包含传递了信道的结构体的地方。我寻找了一个我可以用于我的 specs 的 chan? 断言,但未找到,最后到了这里。
回答 Rich 的引用:是的,我认为对于“流行”的界面需要断言——spec 编写者可能并不知道(或者关心)必须实现哪些接口。我不知道 ReadPort 是什么,但我正在编写 core.async 代码,我需要指定某些内容“是一个信道”。
评论由:davidrupp提交
实现chan?谓词。
评论由:halgari提交
我赞同这个提议,但上次我问Rich的时候,他的回答是“你想要每个接口都提供一个谓词吗?”。
由于core.async的实现,你可能还需要两个额外的谓词。一个用于read-port?,另一个用于write-port?。你可以使用(satisfies? clojure.core.async.impl.protocols/ReadPort ...),但这是一个内部实现,因此我更愿意有一个新的谓词,而不是告诉人们去触碰core.async的内部结构。但这最终还是由Rich决定。
评论由:exi提交
我理解你的观点。但那时我们就需要在文档中提升一级,并提供一种方式,以便轻松确定例如(chan)返回值的哪些接口被实现。对我来说,进入core.async的内部结构,并试图确定我想要的接口,特别是在像通道这样的非常基础的事物上,这根本不是一个用户友好的方法。