【发布时间】:2017-02-22 23:24:48
【问题描述】:
我想编写一些通用数学函数,而不假设我的类型是可复制的。这似乎是不可能的,因为数学运算符使用这些值,而不是借用它们。所以需要复制对象,只是为了简单的数学。我也可以只移动它们,但这在借用的上下文中是不可能的,当我想改变一个结构时,这是我需要的。
这里有一些简单的例子,问题出在哪里:
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
}
当我只想用结构的不可复制对象(例如向量的长度)计算某些东西时,它不起作用,因为该值将被消耗,因此结构变得无效,或者借用检查器说“不能离开借用的上下文”。 在变异结构时,我将如何正确使用通用数学? 是否只能用于可复制类型(或显式克隆)?
【问题讨论】:
-
我对这个问题并不完全确定,但我的第一个想法是
Cont本身没有 Add 运算符 - 只有NoCopy对象 - 甚至认为Cont是什么您要添加到NoCopy?另一种选择可能是使cont可变并具有cont = Cont(cont.0 + rel)? -
这只是一个例子。实际上,这种方式可能会有问题,因为我的结构中有很多字段,并且还想在借用的上下文中使用它