Cás*_*sio 3 casting traits rust
我想实现泛型类型结构的特征。特征块内的方法必须返回非泛型类型。我在尝试投射时遇到问题:
struct Rectangle<T> {
x: T,
y: T,
width: T,
height: T,
}
trait Area {
fn area(&self) -> f64;
}
impl<T> Area for Rectangle<T>
where T: std::ops::Mul<Output=T>
{
fn area(&self) -> f64 {
let t_area = self.height * self.width;
let f_area = t_area as f64;
f_area
}
}
fn main() {
let sq = Rectangle { x: 0, y: 0, height: 1, width: 1 };
println!("{}", sq.area());
}
Run Code Online (Sandbox Code Playgroud)
编译器输出是:
struct Rectangle<T> {
x: T,
y: T,
width: T,
height: T,
}
trait Area {
fn area(&self) -> f64;
}
impl<T> Area for Rectangle<T>
where T: std::ops::Mul<Output=T>
{
fn area(&self) -> f64 {
let t_area = self.height * self.width;
let f_area = t_area as f64;
f_area
}
}
fn main() {
let sq = Rectangle { x: 0, y: 0, height: 1, width: 1 };
println!("{}", sq.area());
}
Run Code Online (Sandbox Code Playgroud)
我可以在不使用不安全块的情况下进行转换T
吗f64
?
我可以在不使用不安全块的情况下强制转换
T
为 吗f64
?
什么是T
?u8
要转换到的代码当然与要转换到的f64
代码不同(毕竟后者可能会失败)。u64
f64
在我看来,你面前有两条路:
Area
泛型结束T
,并因此返回T
T
为可以转换为的类型f64
我将演示后者:
impl<T> Area for Rectangle<T>
where T: std::ops::Mul<Output=T> + Clone + std::convert::Into<f64>
{
fn area(&self) -> f64 {
self.height.clone().into() * self.width.clone().into()
}
}
Run Code Online (Sandbox Code Playgroud)