gpt4 book ai didi

generics - 无需复制的通用数学

转载 作者:行者123 更新时间:2023-11-29 07:52:25 25 4
gpt4 key购买 nike

我想编写一些通用数学函数,但不假设我的类型是可复制的。这似乎是不可能的,因为数学运算符会消耗这些值,而不是借用它们。所以需要复制对象,只是为了简单的数学。我也可以只移动它们,但这在我想要改变结构时需要的借用上下文中是不可能的。

这里是一些简单的例子,问题出在哪里:

use std::ops::Add;

struct NoCopy<T>(T); //some non-copyable struct, (maybe a vector)
struct Cont<T>(NoCopy<T>); //some struct contaioning a noncopyable struct

impl<T: Add<Output=T>> Add for NoCopy<T> {
type Output = NoCopy<T>;
fn add(self, x: NoCopy<T>) -> NoCopy<T> {
NoCopy(self.0+x.0)
}
}

fn main() {
let x = NoCopy(1);
let cont = Cont(x);
let rel = NoCopy(2);
cont.0=cont.0+rel; //addition makes struct cont invalid, so i have to copy
}

当我只想用结构的不可复制对象(例如向量的长度)计算某些东西时,它不会工作,因为值将被消耗,因此结构变得无效,或者借用检查器说“不能移出借用的上下文”。在改变结构时,我将如何正确使用通用数学?是否仅适用于可复制类型(或显式克隆)?

最佳答案

一种选择是在引用上实现Add:

impl<'a, T: Copy + Add<Output = T>> Add for &'a NoCopy<T> {
type Output = NoCopy<T>;
fn add(self, rhs: Self) -> NoCopy<T> {
NoCopy(self.0+rhs.0)
}
}

这没关系,因为共享引用是 Copy。请注意,我向 T 添加了一个 Copy 约束以简化此实现(对于整数为真);如果 T 未被复制,则单行方法可能需要更改。

使用它时你必须添加引用,这很遗憾,但它在其他方面是有效的:

fn main() {
let x = NoCopy(1);
let mut cont = Cont(x);
let rel = NoCopy(2);
cont.0=&cont.0+&rel;
}

( Playground )

关于generics - 无需复制的通用数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com