-
Notifications
You must be signed in to change notification settings - Fork 171
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
「第三章」3.4.2 泛型约束
数学角度描述 trait 中的概念混淆与逻辑错误
#99
Comments
@eZioPan 感谢这么详细的反馈。我找时间确认下再讨论。 |
顺带纠正一处问题: trait 不是类型, trait object 才是。 |
@mzji trait是一个Unsize类型。Rust类型系统下,一切皆类型 |
trait 不是类型。证据:你不能创建 trait 的实例,但是你可以创建 trait object 。 |
更严谨的说法是,对于满足 object safety 的 trait 来说,每一个这样的 trait 都有一个对应的类型 dyn trait ,这个类型的实例就是这个 trait 所对应的 trait object 。 |
@eZioPan 刚才仔细看了你的内容,你说的没问题。其实我在写的时候,也是想表达类似的意思,但是不知道为啥把并集搞错成了交集。 可能我脑子里想的是 T 和 T: Trait交集是Trait。 感谢你的澄清。 |
如果把trait 认为是类型的集合 |
检查bound的时候,只需要检查有没有impl这个trait就好了,不用逐个检查方法有没有实现。impl的时候才会检查有没有实现全。 |
@ZhangHanDong @angelrain1 我想两位说的应该是近似的意思了。本质上我们都是对同一个内容的不同描述方法,都没错。我的描述中将加法解释为并集比较符合数学上的直觉,而将冒号解释为限制是来源于冒号在 Rust 通常用法下的衍生:对变量的类型的限制。 这里我也建议张老师在这段体现一下 |
@eZioPan 嗯,正在考虑如何修正内容。后续再讨论。 |
张老师可能是想讲解的通俗易懂,只是描述不够准确 |
@yim7 这个地方确实描述的不够精确。 其实我书里并没有说trait继承,是A会继承B的方法。trait用作限定,trait继承,可以理解为继承这种「行为的限定」。不过这部分内容,后面也会出一个修正,后续再继续讨论。 类比解释,只是写作的一种方式罢了,这个地方我感觉用数学集合解释比较有趣。 |
@LEXUGE 感谢反馈,晚点再回复。 |
我写了一篇博客(英文),应该更加完整一些 |
@LEXUGE 赞 |
其实你在书中 |
@LEXUGE 我在书里的图,只是想给读者一种启迪的作用,方便大家理解trait。 |
原来是这样啊...那我看书时有点较真了 |
@LEXUGE 没事,这样挺好,可以帮助我提升准确度。 |
能否把把电子版也修改一下呢,也是花了钱买的 |
@gm3000 我知道你是花了钱买的,但是电子版也不是我能直接控制的。 出版社需要修订,修订完还得交给售卖平台上架,这里面也有很多工序。我只能催促出版社,出版社再催促平台,如果我能直接控制,我早修改了。 |
在看到这段时,还以为我一直把这个关系理解错了,一开始以为是Rust的特色。又去验证了一下,又查了一下,看到此页,原来是作者笔误。 |
页码与行数
理解 trait 限定
文本或排版错误
文中说
然后举了
Paginate
、Page
、Perpage
三者之间的关系,并推导出这样的联系。
整个段落混淆了
泛型标记
和实类型
,同时也引发了逻辑错误对于
根据大前提
trait 是 方法集合
,我们可以认为同时,根据书中
第 68 页
这里指出了
Paginate trait
中定义的method
默认包含Perpage trait
和Page trait
中定义的method
,也就是说对于
都有
可推导出
与书中的表述是不相符的。
因此
中的 加号 表示的是
并集
同理
若把
T
、A
、B
都看成是以某些方法为元素的集合
,加号 依旧表示
并集
A + B
表示的是trait A
和trait B
中所有方法的总集合对于 泛型标记
T
来说,冒号
表示T
可以使用冒号后的trait(s)
所具有的所有方法对于 某个实类型
CT
来说,冒号
才是对它的限制:要求CT
至少实现冒号后trait(s)
定义的所有的方法才可以被当作泛型标记T
来使用若一个 实类型
CT
的确满足了泛型标记T
的要求,还将 实类型
CT
,泛型标记T
,traitA
,traitB
都看作以某些方法为元素的集合
的话,有下述关系这里与本页中
也不相符
Rust 编程的哲学是组合优于继承
这段中这两句话在数学逻辑上也是冲突的:
交集
产生的就是原集合的子集
,与不能再包含其他子集
冲突对于
实类型
来说,trait bound
是一种具有排除性质
的限定,trait bound
不关注实类型
到底实现多少方法,只关注实类型
没有实现的方法,一旦实类型
没有实现trait bound
中的全部方法,就标记该实类型
不符合trait bound
。对于
泛型标记
来说,trait bound
是具有累加性质
的限定,trait bound
不关注泛型标记
实际使用了多少方法,只关注泛型标记
已经使用的方法,一旦泛型标记
使用了不存在于trait bound
中的方法,就提示错误。The text was updated successfully, but these errors were encountered: