在rust 1.0.0-nightly中,此代码可以正常工作:
fn main() {
let x = 10f64;
let y = 20f64;
let z = x + y;
println!("z = {}", z);
}
但是,如果我尝试使用新类型(根据rust book):
struct Metres(f64);
fn main() {
let x = Metres(10f64);
let y = Metres(20f64);
let z = x + y;
println!("z = {}", z);
}
我收到此编译器错误:
test.rs:6:13: 6:18 error: binary operation `+` cannot be applied to type `Metres`
test.rs:6 let z = x + y;
^~~~~
error: aborting due to previous error
既然Metres
基本上是a f64
,为什么编译器不能使用相同的+
运算符,并Metres
为此创建新对象z
?
如果我不能做诸如添加之类的简单事情,该如何使用新类型?它们如何“非常有用”(如书中所称)?
(对此有一个老问题,但锈蚀变化很大,因此我要提出要求)
新类型以这种方式工作的原因通常是因为您要避免在基础类型上定义的特征。例如,您可能拥有Metres
和Feet
两者都包装f64
但定义了的加法Metres
并Feet
进行单位转换,而普通的f64
加法则不给您。
当然,有时您确实需要基础特征实现。当前,您必须自己编写一个包装实现,但是有一个RFC可以自动生成这些包装:https : //github.com/rust-lang/rfcs/issues/479
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句