Rust泛型Point的print方法为何将浮点值3.0显示为整数3?
问题解析:为何print方法将3.0显示为3?
首先看完整代码:
#[derive(Debug)] struct Point<T, U> { x: T, y: U } impl<T: std::fmt::Display, U: std::fmt::Display> Point<T, U> { fn print(&self) { println!("{} {}", &self.x, &self.y ); } } impl<X1, Y1> Point<X1, Y1> { fn mixup<X2, Y2>(self, other: Point<X2, Y2>) -> Point<X1, Y2> { Point { x: self.x, y: other.y, } } } fn main() { let integer = Point {x: 1, y:2}; let float = Point{x: 2.0, y:3.0}; let floaty = integer.mixup(float); println!("{:?}", floaty); // output: Point { x: 1, y: 3.0 } - OK floaty.print(); // output: 1 3 - NOT OK }
原因分析
floaty的实际类型:
integer是Point<i32, i32>,float是Point<f64, f64>,调用mixup后返回的floaty类型是Point<i32, f64>,它的y字段确实是f64类型的3.0,这点从Debug格式化输出可以确认。Debug与Display的格式化差异:
{:?}使用的是Debugtrait,它的设计目标是输出便于调试的原始值,所以会完整显示浮点数的小数部分(即使是.0)。print方法里的{}使用的是Displaytrait,Rust标准库中f64的Display实现默认会省略末尾无意义的.0,所以3.0会被格式化为3——这是标准库的既定行为,不是print方法的实现问题。
验证与解决
你可以单独测试这个行为:
fn main() { println!("{}", 3.0); // 输出:3 println!("{:?}", 3.0); // 输出:3.0 }
如果想要强制显示小数部分,可以修改print方法的格式化参数,比如指定小数位数:
fn print(&self) { println!("{} {:.1}", &self.x, &self.y ); // 输出:1 3.0 }
内容的提问来源于stack exchange,提问作者adrianp
相关产品推荐
相关产品推荐

