Я хочу реализовать черту для структуры общего типа. Метод внутри блока признаков должен возвращать не общий тип. У меня возникают проблемы при попытке бросить:Нескалярный приведение: `T` как` f64` при выполнении общего умножения
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());
}
И выход компилятор:
error: non-scalar cast: `T` as `f64`
--> src/main.rs:22:22
|
22 | let f_area = t_area as f64;
| ^^^^^^^^^^^^^
Могу ли я бросить T
к f64
без использования небезопасных блоков?
Следует отметить, что 'Into' просто представляет преобразования в подтип исходного типа (те, которые никогда не могут потерять точность). Но я бы сказал, что в этом случае программисту, вероятно, все равно, если области 'u64' или' i64' будут отбрасываться на 'f64' с возможной потерю точности ... Возможно, они это делают. –
@ LukasKalbertodt: Я не знаю точно. Если бы ['TryInto'] (https://doc.rust-lang.org/std/convert/trait.TryInto.html) был стабильным, я бы посоветовал это. –