X

Rust part29

2025/05/18(日) 18:24:32.38ID:UkfPMCWK
1つだけ外したい場合はOption+mem::take/replace使うのが自然だと思う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=a84a532ace40d2bb6603510ca1307756
2025/05/18(日) 19:24:49.27ID:HgIqS8Uk
590だけど1.86で追加されたget_disjoint_mutが使えるかもしれない
少し癖があるけどsplitの代替になるかな

fn main() {
let mut v = vec![1, 2, 3, 4, 5];
let len = v.len();

for i in 0..len {
let Ok([init, [mid], tail]) = v.get_disjoint_mut([0..i, i..i + 1, i + 1..len]) else {
panic!();
};
*mid *= 2;
println!("{init:?} {mid} {tail:?}");
}
}
2025/05/18(日) 21:02:54.43ID:tnDwO9ym
>>584-585程度でこんなんか
安全パターンをプリミティブに単体分離しようと頑張るのは無駄なんだな
結局は要素還元できなくて逆に組み合わせ爆発しそう
2025/05/18(日) 21:12:32.00ID:6WAEpSNG
>>587
>>591-592
ありがとうございます!大変ためになります。
可変借用ルールの影響を受けないように分離するのが良いのですね。

>>585
私はこの方ではないが、これはこれで知りたかったので、それも解決出来る書き方にもなってるので助かります。

>>589
確かに複雑になってくるとまた沼りそうな気はしますね、内部可変性というのも調べてみます。
2025/05/18(日) 21:37:30.85ID:GL3oFIgT
借用チェッカの気持ちとしては、同じオブジェクトへの可変参照が複数ある状態を防ごうとするんだよね

fn act(&mut self, others: &mut [Unit]) { }

の中で、 self を操作しただけで others に影響が出たり、 others への操作が self に影響したりするというのは
潜在的なバグの原因になり得る (読み手にとって意図せぬ動作になり得る) から、そうならないことをコンパイル時に保証しようとする

なので >>587 では、act に渡された時点で self と others は確実に違うものだと分かるコードにすることで、借用チェックの条件をクリアしている

内部可変性は逆に、コンパイル時はいったん不変参照ということにしておいて、実行時に可変借用として取り出すための型
これは「同じオブジェクトへの可変参照は同時に一つまで」というルールを、借用チェッカーではなく自己責任で行うという考え
(「可変参照は同時に一つまで」というルールは変わらないし、実行時にこれを検査する動作になるので、若干のオーバーヘッドはある)

個人的には >>589 も納得できる考えで、エンティティ (idで同一性を検査するオブジェクト) ならそれでいいよねとも思う

Async が絡むと Mutex という別の型 (これも内部可変性と関係する) が出てくるけど、これはまた別のトピックになるので割愛
2025/05/18(日) 22:38:23.16ID:vhS9Z2b5
なにかへまったら話題変更のために自演を始めるんかな?
と思ってしまう

いつも大体そんな流れだし急にポップしてくるこのスレの話題は理論寄りが多いのも変な感じする
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況