patternrustModerate
Is it possible to use `impl Trait` as a function's return type in a trait definition?
Viewed 0 times
possiblereturnfunctiondefinitionuseimpltypetrait
Problem
Is it at all possible to define functions inside of traits as having
However, I get the following error:
Is this a limitation of the current implementation of
impl Trait return types? I want to create a trait that can be implemented by multiple structs so that the new() functions of all of them returns an object that they can all be used in the same way without having to write code specific to each one.trait A {
fn new() -> impl A;
}However, I get the following error:
error[E0562]: impl Trait not allowed outside of function and inherent method return types
--> src/lib.rs:2:17
|
2 | fn new() -> impl A;
| ^^^^^^
Is this a limitation of the current implementation of
impl Trait or am I using it wrong?Solution
If you only need to return the specific type for which the trait is currently being implemented, you may be looking for
For example, this will compile:
Or, a fuller example, demonstrating using the trait:
Playground
As a side note.. I have used
Self.trait A {
fn new() -> Self;
}For example, this will compile:
trait A {
fn new() -> Self;
}
struct Person;
impl A for Person {
fn new() -> Person {
Person
}
}Or, a fuller example, demonstrating using the trait:
trait A {
fn new>(name: S) -> Self;
fn get_name(&self) -> String;
}
struct Person {
name: String
}
impl A for Person {
fn new>(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>(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(a: &T) -> String {
a.get_name()
}Playground
As a side note.. I have used
String here in favor of &str references.. to reduce the need for explicit lifetimes and potentially a loss of focus on the question at hand. I believe it's generally the convention to return a &str reference when borrowing the content and that seems appropriate here.. however I didn't want to distract from the actual example too much.Code Snippets
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()
}Context
Stack Overflow Q#39482131, score: 21
Revisions (0)
No revisions yet.