Skip to content

[第三章] 关于trait的Self类型参数不能被限定为Sized #137

@ChyuWei

Description

@ChyuWei

页码与行数

  • 第73页
  • 薛定谔的类型附近

对于

trait Foo: Sized{
    fn some(&self);
}

文中试图解释为什么不能对trait添加Self:Sized限定:

把trait当做对象使用时, 内部默认为Unsize类型, 将其置于编译期可确定大小的胖指针后, 以供动态调用.
...
如果给trait加上Self:Sized限定, 动态调用trait对象的过程中, 如果碰到Unsize 类型,调用方法将引发段错误.

对于trait Foo, 应该对所有实现Foo的类型都要求为Sized. 所以在后面应该不会有Unsize 的类型.

https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
https://github.com/rust-lang/rfcs/blob/master/text/0546-Self-not-sized-by-default.md

根据这两个rfc, 貌似只是说为了保证trait object必须实现当前trait所以把Sized限定去掉了.

所以书中那部分描述可能不太完善.

Metadata

Metadata

Assignees

No one assigned

    Labels

    已修订已经修订并提交给出版社第三章第三章精选表意问题语言表达有问题,有歧义或难理解

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions