我如何在一个rust结构中初始化默认值,我正在做的事情有问题

hec6srdp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我看了其他问题:)
Is there a faster/shorter way to initialize variables in a Rust struct?
我也在其他帮助答案和文档中看到了这一点。但是下面与提供的模式匹配的代码无法编译。|我该怎么办?

#[derive(Default)]
pub struct Foo2 {
    pub name: String,
    pub test_int: i32,
}

impl Default for Foo2 {
    fn default() -> Self {
        Foo2 {
            name: "Default Name".to_string(),
            test_int: 999,
        }
    }
}

impl Foo2 {
    pub fn print2(&self) {
        println!("Print name: \"{}\" int: {}", self.name, self.test_int );
    }
}

fn foo2_test() {

    let f2 = Foo2 {
        test_int: 1234,
        ..Foo2::Default::default()
    };
    f2.print2();
}

字符串
我得到这个错误:(我使用的是稳定版本)

error[E0119]: conflicting implementations of trait `std::default::Default` for type `Foo2`
   --> src/init_test.rs:99:10
    |
99  | #[derive(Default)]
    |          ^^^^^^^ conflicting implementation for `Foo2`
...
106 | impl Default for Foo2 {
    | --------------------- first implementation here
    |
    = note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)


当我注解掉:

#[derive(Default)]


我得到另一个错误:

error[E0223]: ambiguous associated type
   --> src/init_test.rs:125:11
    |
125 |         ..Foo2::Default::default()
    |           ^^^^^^^^^^^^^
    |
help: if there were a trait named `Example` with associated type `Default` implemented for `Foo2`, you could use the fully-qualified path
    |
125 |         ..<Foo2 as Example>::Default::default()
    |           ~~~~~~~~~~~~~~~~~~~~~~~~~~

h5qlskok

h5qlskok1#

#[derive(Default)]只在你希望编译器为你编写Default::default函数时使用。如果你使用#[derive(Default)],你会得到一个编译器生成的函数,它将name转换为空字符串,将test_int转换为零。因为这不是你想要的,而且你提供了自己的Default实现,所以只需删除#[derive(Default)]行。
一般来说,你要么#[derive(...)]一个特质,要么impl它,但绝不能两者兼而有之。
然后,要调用实现,您可以只使用类型名称。

Foo2::default()

字符串
或者你可以使用turbofish语法。

<Foo2 as Default>::default()

相关问题