在Rust中将模板约束为Copy

eqqqjvef  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(117)

std::mem::replace的Rust文档引用了以下无法编译的代码示例。

struct Buffer<T> { buf: Vec<T> }

impl<T> Buffer<T> {
    fn replace_index(&mut self, i: usize, v: T) -> T {
        // error: cannot move out of dereference of `&mut`-pointer
        let t = self.buf[i];
        self.buf[i] = v;
        t
    }
}

https://doc.rust-lang.org/std/mem/fn.replace.html
有没有可能约束模板类型参数T,使我们强制T是可复制的,从而使此代码法律的?

h43kikqp

h43kikqp1#

你试过这样做吗?你可以像下面这样指定类型参数。

#[derive(Debug)]
struct Buffer<T: Copy> { buf: Vec<T> }

impl<T: Copy> Buffer<T> {
    fn replace_index(&mut self, i: usize, v: T) -> T {
        let t = self.buf[i];
        self.buf[i] = v;
        t
    }
}

然后,你可以写一段这样的代码:

fn main() {
    let mut buf = Buffer::<u8> { buf: vec![1,2,3,4,5] };
    
    println!("before: {:?}", buf);
    
    buf.replace_index(0, 10);

    println!("after: {:?}", buf);
}

上面代码的输出是:

before: Buffer { buf: [1, 2, 3, 4, 5] }
after: Buffer { buf: [10, 2, 3, 4, 5] }

相关问题