< 返回版块

mantou132 发表于 2019-05-26 18:32

Tags:std

https://doc.rust-lang.org/std/default/trait.Default.html

#[derive(Default)]
struct SomeOptions {
    foo: i32,
    bar: f32,
}

fn main() {
    let options: SomeOptions = Default::default();
}

直观感觉不应该设计成类似 SomeOptions::default() 吗?

Default::default() 在执行的时候能预先知道绑定目标类型?

我之前写 js 的,对这个设计不知道怎么理解

评论区

写评论
作者 mantou132 2019-05-29 16:08

谢谢楼上的两位,这个真的是要我在思路上面转变。 编译器改变了写代码的方式。

Ryan-Git 2019-05-27 01:28

直观感觉不应该设计成类似 SomeOptions::default() 吗? 可以写成let options = SomeOptions::default();的。

Default::default() 在执行的时候能预先知道绑定目标类型? 这里可以这样写是因为声明的时候指定了类型 let options: SomeOptions,编译器知道要找这个类的实现。 大部分情况会省略类型让编译器推导(写成 let options = xxx),这时候再这样写就会报错了。

Mike Tang 2019-05-26 23:54

其实两种写法在rust中都可以实现。rust的类型推断是单独的一遍编译,在词法扫描后面。所以他可以跟进前后上下文来推断类型。再判断对应的类型有没有drive Default,就可以用了。

实现传统风格的话,你为这个struct 手动实现一个Default trait.

1 共 3 条评论, 1 页