是否可以部分实现Rust特性?

时间:2019-04-26 05:53:13

标签: rust

我正在阅读 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

1 个答案:

答案 0 :(得分:0)

  

能否部分实现Rust特性?

不。要么全部投入,要么一无所有。

但是为什么要编译一个代码却不能编译另一个代码。

原因是show

上的额外限制
fn show(&self) where T: Display;

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

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

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

未为您的test方法指定此界限,因此您可以使用任何所需的类型来调用它。