gpt4 book ai didi

rust - 是否可以在特征定义中使用 `impl Trait`作为函数的返回类型?

转载 作者:行者123 更新时间:2023-12-03 11:47:21 24 4
gpt4 key购买 nike

是否可以将特征内部的函数定义为具有impl Trait返回类型?我想创建一个可以由多个结构实现的特征,以便所有结构的new()函数返回一个对象,使它们都可以以相同的方式使用,而不必编写特定于每个结构的代码。

trait A {
fn new() -> impl A;
}

但是,出现以下错误:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
--> src/lib.rs:2:17
|
2 | fn new() -> impl A;
| ^^^^^^

这是对 impl Trait当前实现的限制,还是我使用错了?

最佳答案

如果仅需要返回当前正在为其实现trait的特定类型,则可能正在寻找Self

trait A {
fn new() -> Self;
}

例如,它将编译:
trait A {
fn new() -> Self;
}

struct Person;

impl A for Person {
fn new() -> Person {
Person
}
}

或者,举一个更完整的示例,使用该特征进行演示:
trait A {
fn new<S: Into<String>>(name: S) -> Self;
fn get_name(&self) -> String;
}

struct Person {
name: String
}

impl A for Person {
fn new<S: Into<String>>(name: S) -> Person {
Person { name: name.into() }
}

fn get_name(&self) -> String {
self.name.clone()
}
}

struct Pet {
name: String
}

impl A for Pet {
fn new<S: Into<String>>(name: S) -> Pet {
Pet { name: name.into() }
}

fn get_name(&self) -> String {
self.name.clone()
}
}

fn main() {

let person = Person::new("Simon");
let pet = Pet::new("Buddy");

println!("{}'s pets name is {}", get_name(&person), get_name(&pet));
}

fn get_name<T: A>(a: &T) -> String {
a.get_name()
}

Playground

附带说明..我在这里使用了 String来支持 &str引用..减少了对显式生存期的需求,并减少了对当前问题的关注。我认为通常是借用内容时返回 &str引用的惯例,这在这里似乎很合适。.但是我不想过多地偏离实际示例。

关于rust - 是否可以在特征定义中使用 `impl Trait`作为函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65091258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com