表达式中是否存在类型注释的语法? (示例用例:默认特征)

时间:2014-12-21 17:39:25

标签: rust

是否有办法直接在表达式中编写类型注释,例如使用Default::default()时?

例如,在以下示例中,编译器显然无法推断类型:

use std::default::Default;

#[deriving(Default, Show)]
struct Point{ x: int, y: int };

println!("Default Point: {}", Default::default())

我找到的唯一解决方案是在LHS上注释额外let绑定的类型。

let p: Point = Default::default();
println!("Default Point: {}", p)

我希望能以某种方式直接告诉编译器,我想要哪个版本的Default::default()。也许通过这样的事情:

println!("Default Point: {}", Default::default() as Point)
println!("Default Point: {}", Default::default<Point>())
println!("Default Point: {}", Default<Point>::default())
println!("Default Point: {}", Point::default())

但这些都不是有效的语法。

2 个答案:

答案 0 :(得分:5)

目前,这是使用from_str等辅助函数在标准库中完成的。

基本思想是使用函数允许您引入一个类型参数,然后可以使用,如下所示:

use std::default::Default;

#[deriving(Default, Show)]
struct Point{ x: int, y: int }

fn default<T: Default>() -> T { Default::default() }

fn main() {
    println!("Default Point: {}", default::<Point>());
}

答案 1 :(得分:0)

2021 答案:

看起来在现代 Rust 中,不再需要变通方法。此外,@Shepmaster 的建议有效。对于当前的编译器,这两个变体是有效的:

#[derive(Default, Debug)]
struct Point{ x: i32, y: i32 }

fn main() {
    println!("Default Point: {:?}", Point::default());
    println!("Default Point: {:?}", <Point as Default>::default());
}