I am new to Rust, and try to implement Rectangle generic type. The following code gives compile error "move occurs because self.w
has type T
, which does not implement the Copy
trait". How can I fix this and is there a better way to do it?
struct Rectangle <T>{
w : T,
h : T
}
impl<T:std::ops::Mul std::ops::MulAssign std::ops::Mul<Output = T>> Rectangle<T>{
fn get_area(&self) -> T{
return self.w * self.h;
}
fn scale(&mut self, scale:T) {
self.w *= scale;
self.h *= scale;
}
fn new(w:T, h:T) -> Rectangle<T> {
return Rectangle{
w:w,
h:h
};
}
}
fn main() {
let rect = Rectangle::new(1.2, 3.4);
let area = rect.get_area();
println!("Rectangle Area {area}");
}
CodePudding user response:
Your problem is that you need to add Copy
to the list of traits you want T to implement:
impl <T: ... Copy> Rectangle {
^^^^^^
But I find keeping track of those long traits for numeric types to be painful, and so I usually introduce an umbrella trait. In your case it would look something like:
trait Field: std::ops::Mul std::ops::MulAssign std::ops::Mul<Output = Self> Copy {}
impl <T:std::ops::Mul std::ops::MulAssign std::ops::Mul<Output = Self> Copy> Field for T {}
Then you can just write:
impl <T:Field> Rectangle {
...
}