我在Rust程序中定义了两个结构和一个函数,我正在实现自己的线性代数。在这样做的过程中,我偶然发现了Rust对生命时间的了解。根据我的理解,生命周期注释只是告诉编译器一个输入变量必须至少和输出变量一样长。
但是现在我实际上是在尝试告诉编译器我的输出与输入无关。当然,我接受引用,但是新结构是通过创建新切片并用新值填充它们来构造的(f64)。
所以,我的想法是我有两个输入,在调用函数时它的生命周期可以是无关的,第三个是输入无关,因为一个没有引用旧结构的新结构是创建。 (见下面的代码)。
可悲的是,这会返回错误,说实话,我不知道它的真正含义。我的意思是,我可以阅读这些文字并了解这些文字,但它并不符合我脑海里的生命想法。我需要在生命中重新焕然一新,或者有人向我指出我所理解的错误。
我从中得到的是它抱怨我的输出与输入没有关系/约束,这正是我想要的!
error[E0207]: the lifetime parameter `'c` is not constrained by the impl trait, self type, or predicates
--> src/mat.rs:199:14
|
199 | impl<'a, 'b, 'c
| ^^ unconstrained lifetime parameter
error[E0207]: the lifetime parameter `'c` is not constrained by the impl trait, self type, or predicates
我不需要任何关于如何正确实现矩阵乘法或矩阵的信息,因为我正在四处学习Rust。我需要一个答案,向我展示我对Rust的误解。
两个结构:
pub struct ColVector<'a> {
values: &'a [f64],
}
pub struct Matrix<'a> {
values: &'a [&'a [f64]],
shape: (usize, usize) // Tuple containing size. First value is rows, second is columns
}
* -operator的实现覆盖(我有3个其他的,都给出了同样的错误)
impl<'a, 'b, 'c> Mul<&'a ColVector<'a>> for &'b Matrix<'b> {
type Output = ColVector<'c>;
fn mul(self, v: &'a ColVector) -> ColVector<'c> {
self.mat_mult(v)
}
}
编辑:我看不出这是如何与问题Return local String as a slice (&str)重复。那个问题是关于某人试图返回对函数本地变量的引用,这不是我想要做的。我的函数不返回引用,而是返回包含对新创建的切片的引用的结构。