rust中如何實現返回可變引用的迭代器?

時間 2021-06-05 16:00:01

1樓:Jason5Lee

找到乙個trade-off

pubstruct

RowIter

<'a>impl

<'a>Iterator

forRowIter

<'a>}

2樓:Nugine

沒有什麼所有權問題是 Rc> 不能解決的,如果有,那就再套一層。

開完玩笑,讓我們看看為什麼 Safe Rust 中無法實現題目中的邏輯。

迭代器特性要求迭代器的引用的生存期與它產生的 Item 的生存期無關。因此可以用 Vec 的迭代器的短期引用獲得 Vec 中的資料的長期引用,對於其他記憶體集合型別也一樣。

而題目中的定義是這樣的

pubstruct

RowIterMut

<'a>為它實現迭代器特徵時,相當於用指向長期引用的短期引用獲得長期引用,能獲得一次就能獲得第二次,無法保證 &mut Node 的唯一性。需要用 unsafe 提供保證:迭代器產生的 &mut Node 是互不相同的。

在迭代器 next 方法的簽名下,這一點用 Safe Rust 無法表達。

另乙個回答利用了slice的可變引用能被拆分的特點,本質上是提供了兩個拆分引用的獨佔保證,相當於組合了vec的迭代器。

GAT 提供指定 Item 的生存期的方法,編譯器將能推導迭代器的引用的生存期與 Item 的生存期的關係,覆蓋迭代器從內部產生值的情況。只不過 GAT 這個特性要等很久。

3樓:

貌似是不能用safe rust實現的:

實現的貌似話需要等GAT:

Solving the Generalized Streaming Iterator Problem without GATs

看了一下std的實現,直接是unsafe指標操作:

Rust結構體中包含自身成員的引用時,生命週期應當如何標註?

hjiayz 加上refcell就行了,如果多執行緒需要上鎖Rust Playground usestd cell RefCell pub struct CallBack a,T,F pubstruct Context a,T,F impl a,T Copy Default F Fn T CallB...

Rust 如何實現柯里化?

姜哲 可以考慮用dyn Trait來實現。type F1 U Box U type F2 T2,U Box Box U type F3 T2,T3,U Box Box Box U fn curry2 T2,U,F f F F2 T2,U where F static FnOnce T1 T2 U T...

Rust的設計中為什麼要區分不可變變數和常量?

Tracy Liang 剛剛在學習,同樣有這個疑問。const 在編譯期確定,可能是字面值,指令運算元。不占用資料段,不在堆疊,靜態區等記憶體空間。let 是執行期佔記憶體空間的,有實體,一般都有位址。只是不可變,在初始化就確定了,但是唯讀。我是不知道這種唯讀變數的意義。 套路小迷糊 對於初級玩家來...