gpt4 book ai didi

generics - 为什么在实现特征时需要重复我的泛型类型约束?

转载 作者:行者123 更新时间:2023-11-29 08:20:04 24 4
gpt4 key购买 nike

在学习 Rust 时,我偶然发现了以下场景。

考虑这个例子:

use std::fmt::Debug;

struct Foo<T>
where
T: Debug,
{
data: T,
}

impl<T> Drop for Foo<T> {
fn drop(&mut self) {
println!("Dropping Foo with data: '{:?}'!", self.data);
}
}

这不编译:

error[E0277]: `T` doesn't implement `std::fmt::Debug`
--> src/lib.rs:10:9
|
10 | impl<T> Drop for Foo<T> {
| ^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
= help: the trait `std::fmt::Debug` is not implemented for `T`
= help: consider adding a `where T: std::fmt::Debug` bound
note: required by `Foo`
--> src/lib.rs:3:1
|
3 | / struct Foo<T>
4 | | where
5 | | T: Debug,
6 | | {
7 | | data: T,
8 | | }
| |_^

解决这个问题的方法是在实现 Drop 时显式定义类型约束:

impl<T> Drop for Foo<T>
where
T: Debug,
{
fn drop(&mut self) {
println!("Dropping Foo with data: '{:?}'!", self.data);
}
}

但是,我最终在多个地方遇到了相同的约束,这对我来说意义不大。

在结构声明级别定义约束就足够了,编译器应该假设 T 总是会实现 Debug,因为我们根本无法在没有 T: Debug

的情况下初始化 Foo

为什么需要这种明确性?这是故意的还是当前的编译器限制?

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