首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我要在特征上实现方法,而不是作为特征的一部分?

为什么我要在特征上实现方法,而不是作为特征的一部分?
EN

Stack Overflow用户
提问于 2015-12-23 23:22:07
回答 1查看 5.1K关注 0票数 44

在试图更好地理解Any特性时,我发现它是has an impl block for the trait itself的。我不理解这个构造的目的,甚至不知道它是否有一个特定的名称。

我用“正常”特征方法和impl块中定义的方法做了一个小实验:

代码语言:javascript
运行
复制
trait Foo {
    fn foo_in_trait(&self) {
        println!("in foo")
    }
}

impl dyn Foo {
    fn foo_in_impl(&self) {
        println!("in impl")
    }
}

impl Foo for u8 {}

fn main() {
    let x = Box::new(42u8) as Box<dyn Foo>;
    x.foo_in_trait();
    x.foo_in_impl();

    let y = &42u8 as &dyn Foo;
    y.foo_in_trait();
    y.foo_in_impl(); // May cause an error, see below
}

编辑笔记

在Rust 1.15.0及之前的版本中,行y.foo_in_impl()会导致错误:

错误:借用的值不够长--> src/main.rs: 20 :14 |20|让y= &42u8因为&Foo;|^不够长... 23 |}|-临时值仅存在到此处|=注意:借用的值必须在静态生存期内有效...

此错误在后续版本中不再存在,但答案中解释的概念仍然有效。

从这个有限的实验来看,在impl块中定义的方法似乎比在trait块中定义的方法更具限制性。很可能有一些额外的东西以这种方式解锁,但我只是还不知道它是什么!^_^

关于traitstrait objects的Rust编程语言中的章节没有提到这一点。搜索Rust源代码本身,似乎只有AnyError使用这一特殊功能。我还没有在我看过源代码的几个板条箱中看到过这一点。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34438755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档