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 的,对这个设计不知道怎么理解
1
共 3 条评论, 1 页
评论区
写评论谢谢楼上的两位,这个真的是要我在思路上面转变。 编译器改变了写代码的方式。
直观感觉不应该设计成类似 SomeOptions::default() 吗? 可以写成let options = SomeOptions::default();的。
Default::default() 在执行的时候能预先知道绑定目标类型? 这里可以这样写是因为声明的时候指定了类型 let options: SomeOptions,编译器知道要找这个类的实现。 大部分情况会省略类型让编译器推导(写成 let options = xxx),这时候再这样写就会报错了。
其实两种写法在rust中都可以实现。rust的类型推断是单独的一遍编译,在词法扫描后面。所以他可以跟进前后上下文来推断类型。再判断对应的类型有没有drive Default,就可以用了。
实现传统风格的话,你为这个struct 手动实现一个Default trait.