gpt4 book ai didi

rust - Rust traits 可以部分实现吗?

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

我正在阅读 Programming Rust 这本书,并了解了 Rust 的特性和泛型类型。而且我发现类型界限可以放在特征的方法上。然后我构建了以下特征并将其实现为一个结构。

use std::fmt::Display;
trait Test<T> {
fn show(&self)
where
T: Display;
fn test(&self);
}

struct S<T> {
field: T,
}

impl<T> Test<T> for S<T> {
fn show(&self)
where
T: Display,
{
println!("My field: {}", self.field);
}

fn test(&self) {
println!("Just for test");
}
}

以下代码无法按预期编译:

struct R;

fn main() {
let s = S { field: R {} };
s.show();
}

但是下面的代码可以编译运行。

struct R;

fn main() {
let s = S { field: R {} };
s.test();
}

s 被定义为 S { field: R{} } 时,Rust 不应该拒绝代码吗?这是否意味着 sS 的一个实例,它部分实现了 trait T

最佳答案

Can Rust traits be partially implemented?

没有。要么全力以赴,要么一无所有。

但为什么一个代码可以编译而另一个不能。

原因是 show 上的额外绑定(bind)

fn show(&self) where T: Display;

这意味着,当您要调用此方法时,您的T 必须实现Display。如果未实现,则无法调用。

例如,Rust 的“泛型”工作方式不同于 C++。

在 C++ 中你有 SFINAE (替换失败不是错误)。这是一种 duck typing .
Rust 在边界上工作,这意味着你必须指定你的“泛型”必须实现什么样的特征才能使用这些函数。在这种情况下,您可以调用 Display::fmt因为您指定,您的 T 必须实现该特征。

没有为您的 test 方法指定此绑定(bind),因此您可以使用您想要的任何类型调用它。

关于rust - Rust traits 可以部分实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861524/

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