Rust part27 (405レス)
上下前次1-新
49: 2024/12/04(水)20:50 ID:H1WoIidK(1) AAS
>>48
C++が悪いということ?
50: 2024/12/04(水)21:15 ID:9m5UuMRD(1) AAS
Webページ毎に別なので
アリーナ的管理により循環参照があろうと一気に解放するためリークが起きようがない
51: 2024/12/04(水)22:53 ID:mxpvKjAM(3/3) AAS
メモリリークと脆弱性の混合物なら急を要するが完全に分離されたから意識低くなった
52: 2024/12/04(水)23:26 ID:dIFgKrXU(2/2) AAS
>>48
悪いっていうより、自由が利きやすいんじゃない
53(3): 2024/12/05(木)21:10 ID:qJrgBNQF(1) AAS
iterator traitのnextでiteratorの中のデータの参照を返すことがどうしてもできません
教えてください
54: 2024/12/05(木)21:32 ID:xceXpzKh(1) AAS
>>53
コードで出して。
55: 2024/12/05(木)21:37 ID:nBO5q7w2(1) AAS
>>53
lending iteratorでググるといい
56: 2024/12/05(木)23:37 ID:cvEJUy50(1/2) AAS
// まず、データを保持する構造体を定義
struct DataHolder {
items: Vec<String
}
// イテレータ構造体を定義
// ライフタイムパラメータ 'a を使って、参照の寿命を明示
struct DataIterator<'a> {
data: &'a DataHolder, // データへの参照
index: usize, // 現在の位置
}
省15
57: 2024/12/05(木)23:38 ID:cvEJUy50(2/2) AAS
// Iteratorトレイトの実装
impl<'a> Iterator for DataIterator<'a> {
// 返り値の型を&'a Stringと指定
type Item = &'a String;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.data.items.len() {
let item = &self.data.items[self.index];
self.index += 1;
Some(item)
} else {
省13
58: 2024/12/06(金)07:47 ID:tRnxKL09(1/4) AAS
こんな感じです
struct It<'a>{
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
Some(self.i)
}
}
59: 2024/12/06(金)10:39 ID:zw4qy2EX(1) AAS
mut いらん
60(1): 2024/12/06(金)10:45 ID:7cNjBV3c(1) AAS
iter()が作りたいのか、iter_mut()が欲しいのかどっちかな?
あとこれだと無限に続くイテレータになるけど終了条件は?
61(2): 2024/12/06(金)12:04 ID:tRnxKL09(2/4) AAS
struct It<'a>{
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
self.i+=1;
Some(self.i)
}
}
省4
62: 2024/12/06(金)12:07 ID:tRnxKL09(3/4) AAS
すいません*つけわすれました
63: 2024/12/06(金)12:08 ID:tRnxKL09(4/4) AAS
>>60
終了条件は25です
64: 2024/12/06(金)12:19 ID:B3lagOoh(1) AAS
結局毎回同じ参照返すならイテレータじゃなくてよくね
65(2): 2024/12/06(金)12:49 ID:B2jbh63z(1/2) AAS
自分の可変参照を返したいならGATでこうする
use lending_iterator::prelude::*;
fn main() {
let mut v: Vec<String> = ["a", "b", "c", "d", "e"].into_iter().map(str::to_string).collect();
my_iter_mut(&mut v)
.skip(1)
.take(3)
.for_each(|s| s.push('x'));
assert_eq!(v, ["a", "bx", "cx", "dx", "e"]);
}
省19
66: 2024/12/06(金)17:58 ID:B2jbh63z(2/2) AAS
>>65
自己レス
即興で作って冗長な表記があったため
next()関数はこれで
fn next(&mut self) -> Option<Item<'_, Self>> {
(self.index < self.slice.len()).then(|| {
let nth = &mut self.slice[self.index];
self.index += 1;
nth
})
省1
67(1): 2024/12/06(金)18:45 ID:OtZyNvR4(1) AAS
>>61
next()で返された不変参照r1(&i32)が生きてる間に次のnext()が呼ばれたら
r1の参照先の値が変わることになるからこの形はIteratorだと実現できないな
同じ値に対する&Tと&mut Tが共存できないルールに引っかかる
next()の戻り値にIt自体のライフタイム(&'b mut selfの'b)を含めて
戻り値の参照が存在してる間は次のnext()を呼べない形にしないといけないけど
Iteratorはそういう制限を想定してない
68(1): 2024/12/07(土)00:37 ID:MlZHBv1+(1/5) AAS
Vecなどを作れて逆順にもできるイテレータとは性質が異なる
異なるものを、どっちも同じだと頑なに主張し続ける必要はない気がする
上下前次1-新書関写板覧索設栞歴
あと 337 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.007s