最近,我看到了不同的地方,这是作为示例代码给出的,在我的编辑器中编写它,它似乎是有效的代码.

trait Trait {}

impl<T> Trait for T {}

我似乎找不到任何解释这一点的文档;我确信它存在,但我真的不知道要用谷歌搜索什么.

如何将T实例化到Impl块中,然后调用其中的任何方法?

我相信这是有很好的理由的,但我似乎不能理解它,有谁能够链接到Ruust中这个特性的相关文档?


我从答案中意识到,我可能并不清楚;我抄袭了我所看到的例子.

虽然从第一个答案中,我意识到下面的代码也是有效的,并且可能更清楚地表达了我试图询问的问题,即允许此代码有效的泛型语法有什么用处:

trait Trait {
    fn test() -> String {
        "test".to_string()
    }
}

impl<T> Trait for T {}

这是否会影响文件中现有的 struct 和枚举,或者它实际上什么都不做,永远不能调用或使用?

推荐答案

这段代码向您展示了两件事:标记特征和全面实现.

trait Foo {}(没有特征成员)声明marker trait,它只用于标记某些类型.内置性状CopySendSync是标记性状的很好的例子.

impl<T> Foo for T {}为所有类型实现了特征Foo,即所谓的blanket implementation.

总而言之,这几乎是多余的,因为"实现Foo的类型"和"所有类型"之间没有区别.

然而,看似毫无用处的全面实现实际上可能是有用的.在Rust标准库中,有一个全面的实现impl<T> From<T> for T,它告诉Rust"您可以将任何T转换为T".这本身并不有用,但最终在泛型代码中很有用,例如fn foo(arg: impl Into<i32>),它允许您传递任何类型的参数,这些参数可以正确地转换为i32.Because of the blanket implementation, this includes 104 itself.

您将如何实例化T以调用Impl块中的任何方法?

在这种情况下,impl号区块的主体不可能有任何东西.impl ... for块的主体是实现特征成员,但要实现的特征没有成员.

如果我们假设特征does有成员,那么您的问题的答案将是,您必须以一种允许您对其执行操作的方式来限定T.例如,要创建T,您可以 Select 添加界限T: Default,这将允许您调用T::default()来创建具有(类型定义的)缺省值的T的实例.

请注意,在T上添加边界会将实现的范围更改为仅应用于满足边界的类型.这在实践中是很常见的.例如,CloneVec<T>上的实现是T: Clone上的边界.(如果你毕竟不能克隆载体的元素,你怎么克隆它呢?)


进一步阅读:

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

如何装箱生命周期相关联的两个对象?

为什么reqwest以文本形式下载二进制文件?

为什么这是&q;,而让&q;循环是无限循环?

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如何修复数组中NewType导致的运行时开销

变量需要parse()中的显式类型

如何实现Deref;多次;?

由于生存期原因,返回引用的闭包未编译

RUST 中的读写器锁定模式

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

如何迭代存储在 struct 中的字符串向量而不移动它们?

一次不能多次borrow *obj作为可变对象

存储返回 impl Trait 作为特征对象的函数

如何在 Emacs Elisp 中获得类似格式化的 LSP?

&self 参数在 trait 的功能中是必需的吗?

Rust 将特性传递给依赖项

我如何将特征作为 struct 的拥有字段?

使用泛型作为关联类型,没有幻像数据

如何从 Rust 中不同类型的多个部分加入 Path?