gpt4 book ai didi

rust - 是在 impl block 上还是在方法上指定 trait bound 更好?

转载 作者:行者123 更新时间:2023-11-29 07:46:57 25 4
gpt4 key购买 nike

假设我想创建一些包装其他泛型类型的类型,如下所示:

struct MyWrapper<T> {
pub inner: T,
}

现在,如果内部类型满足特定界限,我希望我的类型有一个方法。例如:我想打印它(在本例中为简单起见不使用 fmt 特征)。为此,我有两种可能性:向 impl 添加一个边界或方法本身。

方法绑定(bind)

impl<T> MyWrapper<T> {
pub fn print_inner(&self) where T: std::fmt::Display {
println!("[[ {} ]]", self.inner);
}
}

当使用 MyWrapper<()> 调用此函数时我得到:

error[E0277]: `()` doesn't implement `std::fmt::Display`
--> src/main.rs:20:7
|
20 | w.print_inner();
| ^^^^^^^^^^^ `()` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
|
= help: the trait `std::fmt::Display` is not implemented for `()`

实现绑定(bind)

impl<T: std::fmt::Display> MyWrapper<T> {
pub fn print_inner(&self) {
println!("[[ {} ]]", self.inner);
}
}

再次错误地调用它,给出:

error[E0599]: no method named `print_inner` found for type `MyWrapper<()>` in the current scope
--> src/main.rs:19:7
|
1 | struct MyWrapper<T> {
| ------------------- method `print_inner` not found for this
...
19 | w.print_inner();
| ^^^^^^^^^^^
|
= note: the method `print_inner` exists but the following trait bounds were not satisfied:
`() : std::fmt::Display`

我的问题是:什么更符合地道?是否存在语义差异(除了具有特征的终生内容,解释 here )?除了编译器消息之外还有其他区别吗?

最佳答案

一个语义上的区别是,通过绑定(bind)在方法上的类型,您可以部分实现一个特征:

trait Trait {
fn f(self) where Self: std::fmt::Display;
fn g(self);
}

struct Struct<T>(T);

impl<T> Trait for Struct<T> {
fn f(self) where Struct<T>: std::fmt::Display {
println!("{}", self);
}
fn g(self) {
println!("Hello world!");
}
}

fn main() {
let s = Struct(vec![1]);

// f is not implemented, but g is
//s.f();
s.g();
}

如果您有许多具有不同类型边界的可选方法,这可能会很有用,否则这些方法将需要单独的特征。

关于rust - 是在 impl block 上还是在方法上指定 trait bound 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36142626/

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