2017-02-22 72 views
3

複製通用的數學我想寫一些通用的數學函數,沒有假設,我的類型是可複製。這似乎是不可能的,因爲數學運算符會消耗這些值,而不是借用它們。所以需要複製對象,僅用於簡單的數學運算。我也可以將它們移動,但是當我想要改變一個結構時,這在借用的上下文中是不可能的,而這是我需要的。沒有生鏽

這裏是一些簡單的例子,在那裏有問題:

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 
} 

當我剛要計算的東西與結構的不可拷貝的對象(例如向量的長度),也不會工作,因爲該值將要麼被消耗掉,所以結構變得無效,或借檢查說「不能搬出借來的語境」。 變異結構時,我將如何正確使用一個通用的數學,? 僅可複製類型(或顯式克隆)?

+0

我不能完全肯定的問題,但我的第一個想到的是,'Cont'本身不具有添加操作 - 只有'NoCopy'對象 - 甚至認爲'Cont'是您要添加到'NoCopy'什麼?另一種選擇可能是讓'cont'變爲可變的並且有'cont = Cont(cont.0 + rel)'? –

+0

這只是一個例子。實際上,這種方式可能會有問題,因爲我的結構中有很多字段,並且也想在借用的上下文中使用它 – porky11

回答

9

一種選擇是在參考實施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。注意我添加了一個Copy約束T,使這個簡單的實現(爲整數真);如果T未複製,則可能需要更改單線程方法。

你必須使用它的時候,這是一種恥辱添加引用,但它的工作原理,否則:

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

Playground