Rustアンチスレ at TECHRustアンチスレ - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト50:デフォルトの名無しさん 20/03/25 12:40:37 COJzGufp.net >>49 RAD言語ならそれで良いが、システム言語では駄目。 51:デフォルトの名無しさん 20/08/09 13:48:40.83 cPfQFxYQ8 >>48 愚直に実装すると複数ヶ所で同一のミュータブルな参照を保持する必要に迫られるけど, それはRustではコンパイルエラー じゃあどうするか? → 内部でUnsafeな生ポインタを使う みたいな話か 52:デフォルトの名無しさん 20/08/28 02:41:24.81 BFWbiW8H.net Rustは、コンテナは、配列(長さがコンパイル段階で静的に決まる固定長)、 ベクター(動的配列)が主で、LinkedList<T>は、せっかくのリンクトリストの 特徴である末尾以外の「途中」への追加は出来ない。 これではリンクリストの意味が無い。 また、公式ドキュメントに 「ベクターの方がLinkedList<T>より速い」 などと書いてあるが、それはとんでもない間違い。 53:デフォルトの名無しさん 20/08/28 17:13:22 BFWbiW8H.net リンクリストを実装するのはこんなに難しく、 nextメンバの型は、Option<Rc<RefCell<Node<T>>>> となる : type Link<T> = Rc<RefCell<Node<T>>>; #[derive(Debug)] struct Node<T> { value: T, prev: Option<Link<T>>, next: Option<Link<T>>, } impl<T> LinkedList<T> { pub fn append(&mut self, v: T) { let node = Node::new(v); match self.tail.take() { Some(old_tail) => { old_tail.borrow_mut().next = Some(Rc::clone(&node)); node.borrow_mut().prev = Some(old_tail); } None => { // first element debug_assert_eq!(self.len(), 0); self.head = Some(Rc::clone(&node)); } } self.tail = Some(node); self.length += 1; } } 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch