我在 Rust 中撰寫了一個通用矩陣庫,并想做一個點積函式
這個:
pub fn dot<'a, R: Scalar>(&'a self, rhs: &'a Matrix<R, M, 1>) -> T
where
T: Sum<&'a T>,
&'a Self: Mul<&'a Vector<R, M>, Output = Self>,
{
(self * rhs).elements().sum::<T>()
}
導致了一個我不明白的令人困惑的錯誤:
304 | pub fn dot<'a, R: Scalar>(&'a self, rhs: &'a Matrix<R, M, 1>) -> T
| -- lifetime `'a` defined here
...
309 | (self * rhs).elements().sum::<T>()
| ^^^^^^^^^^^^-----------
| |
| creates a temporary which is freed while still in use
| argument requires that borrow lasts for `'a`
310 | }
| - temporary value is freed at the end of this statement
在盲目地嘗試不同的東西搜索類似的問題后,我得出了解決方案
pub fn dot<'a, R: Scalar>(&'a self, rhs: &'a Matrix<R, M, 1>) -> T
where
T: for<'b> Sum<&'b T>,
&'a Self: Mul<&'a Vector<R, M>, Output = Self>,
{
(self * rhs).elements().sum::<T>()
}
這行得通,但我不明白為什么它是必要的。為什么臨時沒有持續整個功能塊的長度?那'b指的是什么壽命?
語境:
Matrix是
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Matrix<T, const M: usize, const N: usize>
where
T: Scalar,
{
data: [[T; N]; M], // Column-Major order
}
并且Vector是
pub type Vector<T, const N: usize> = Matrix<T, N, 1>;
elements()在 .上回傳一個展平的迭代器data。mul回傳與 相同的型別Self。如果我將dot()正文更改為:
self.clone().data[0].iter().sum::<T>()
所以這不是其他方法的問題Matrix
self * rhs如果我分配給一個變數,也會發生同樣的事情
uj5u.com熱心網友回復:
問題是您使用了太多的生命周期注釋。如果你真的考慮你給編譯器的生命周期,那是對的。您正在洗掉仍在使用的臨時檔案。有了界限T: Sum<&'a T>,您已經告訴它 aT可以由&'a Ts 組成。并且與'a借用的生命相同。但是:回傳一個新的,擁有的,呼叫它,它只存在于函式的剩余部分,呼叫那個生命周期。self&Self * &Vector<R, M> SelfP'p
現在,elements可能有一個類似的簽名fn elements<'a>(&'a self) -> impl Iterator<Item = &'a T>(也許其中一些生命周期實際上被省略了,但它們仍然存在)。所以當你打電話時P.elements,你實際上是在打電話elements(&'p P) -> impl Iterator<Item = &'p T>。
然后,當您呼叫sum::<T>它時,編譯器只知道如何從s 中sum生成新的,因此它推斷必須等于。但他們顯然不是。只持續到功能結束,同時繼續生活。這就是您收到錯誤的原因:您無緣無故地將您要回傳的生命系結。T&'a T'p'a'p'aTself
我沒有考慮太多但可能仍然有用的經驗法則是:如果你self不可變地借用并且回傳型別沒有捕獲生命周期(即不是參考、特征物件、animpl Trait或呼叫者提供的泛型),您可能不需要指定引數的生命周期。
也就是說:您不關心它們的生命周期,self或者rhs因為您正在回傳一個不參考它們中的任何一個的擁有型別。
當然,你的where子句中仍然需要生命周期,這就是它的for<'x> _: ...用武之地。這就是所謂的HRTB,基本上是說,“對于任何生命周期,我都會插入有效'x之后的:內容。” 這就是你關心的。只要您只有參考,它就可以作業,而不是只要您有適用于任何特定的參考'x。
所以你可以像這樣簡單地重寫dot簽名
pub fn dot<R: Scalar>(&self, rhs: &Matrix<R, M, 1>) -> T
where
for<'x> T: Sum<&'x T>,
for<'y> &'y Self: Mul<&'y Vector<R, M>, Output = Self>,
{ // ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533013.html
標籤:仿制药锈寿命高级类型
