How to implement generics struct correctly

tha10

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}");
}
Michael Anderson

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 {
 ...
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related