我正在阅读 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不会拒绝代码吗?这是否意味着s
是S
的实例,它部分实现了trait T
?
答案 0 :(得分:0)
能否部分实现Rust特性?
不。要么全部投入,要么一无所有。
但是为什么要编译一个代码却不能编译另一个代码。
原因是show
fn show(&self) where T: Display;
这意味着,当您要调用此方法时,您的T
必须实现Display
。如果未实现,则无法调用。
例如,锈迹“泛型”的工作方式不同于C ++。
在C ++中,您有SFINAE(替换失败不是错误)。这是duck typing的一种。
Rust在边界上起作用,这意味着您必须指定“泛型”必须使用哪种特征才能使用这些功能。在这种情况下,您可以致电Display::fmt
,因为您已指定T
必须实现该特征。
未为您的test
方法指定此界限,因此您可以使用任何所需的类型来调用它。