是否有办法直接在表达式中编写类型注释,例如使用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())
但这些都不是有效的语法。
答案 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());
}