【发布时间】:2019-04-08 05:37:02
【问题描述】:
我正在研究一个简单的复数示例,并尝试如下实现 ref-value/value-ref 操作:
use std::ops::*;
#[derive(Clone, PartialEq)]
pub struct Complex<T: Sized + Clone> {
pub re: T,
pub im: T,
}
// Ref-Ref Multiplication
impl<'a, 'b, T: Sized + Clone> Mul<&'b Complex<T>> for &'a Complex<T>
where
T: Add<T, Output = T>,
T: Sub<T, Output = T>,
&'a T: Add<&'b T, Output = T>,
&'a T: Mul<&'b T, Output = T>,
&'a T: Sub<&'b T, Output = T>,
{
type Output = Complex<T>;
fn mul(self, rhs: &'b Complex<T>) -> Complex<T> {
panic!("// Details irrelevant")
}
}
// Ref-Value Multiplication
impl<'a, 'b, T: Sized + Clone> Mul<Complex<T>> for &'a Complex<T>
where
T: 'static,
T: Add<T, Output = T>,
T: Sub<T, Output = T>,
&'a T: Add<&'b T, Output = T>,
&'a T: Mul<&'b T, Output = T>,
&'a T: Sub<&'b T, Output = T>,
{
type Output = Complex<T>;
fn mul(self, rhs: Complex<T>) -> Complex<T> {
let t = &rhs;
self.mul(t)
}
}
ref-ref 实现有效,据我了解,它需要两个不同生命周期的引用,并返回一个复杂的值类型。 ref-value 部分是我遇到问题的地方;当我编译时,错误是rhs 的寿命不够长。我相信我知道为什么已经这样了,那就是当返回值时 T 可以持有对 rhs 的引用(直接或间接),因此rhs 超出范围,但T 可以持有对还是这样。
我的问题是如何传达T 不会以某种形式或形式对rhs 进行某些引用。
关于我迄今为止尝试过或看过的东西的一些注释:
- 更改了任一 Mul 实现的生命周期规范。
- 尝试了生命周期继承,但这指定了
T持有的引用将至少与T一样长,所以我认为我需要更多的“最多”行。 - 查看了其他实现;要么不实现案例,要么只使用克隆绕过问题。
【问题讨论】:
-
可能您应该为
Complex派生Clone,然后为Complex而不是&Complex实现操作。这不仅绕过了问题,而且通常比像这样的小结构的引用更快。 -
我什至会更进一步,为复数类型派生
Copy,因此您甚至不必显式克隆。 -
@SvenMarnach 谢谢,这实际上是我打算写的! (
Copy,不是Clone):) -
您对
&'a T的限制是不必要的。最后,您要将T从另一个Complex<T>中复制出来,并将它们移动到一个新的Complex<T>中。这里没有办法引用原始的T,所以考虑对&T的操作是没有意义的。 -
你看起来像你想要的 impl AddAssign.
标签: rust lifetime type-parameter