目次

Rustの勉強[unsafe その3]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版

を読んでいる

お勉強

#

NO IMAGEUnsafe Rust - The Rust Programming Language 日本語版

  • むちゃくちゃ体調がいい
    • 昨日何もせずにずっと寝ていた
  • 15分縛りかつ準備も含めてるから圧縮するしかない

メモ

#
  • unsafeに対して安全という言葉を使っていることに違和感しかない
let mut v = vec![1, 2, 3, 4, 5, 6];

let r = &mut v[..];

let (a, b) = r.split_at_mut(3);

assert_eq!(a, &mut [1, 2, 3]);
assert_eq!(b, &mut [4, 5, 6]);
  • こいつはsafe rustでは無理らしい
error[E0499]: cannot borrow `*slice` as mutable more than once at a time
(エラー: 一度に2回以上、`*slice`を可変で借用できません)
-->
|
6 | (&mut slice[..mid],
|      ----- first mutable borrow occurs here
7 |  &mut slice[mid..])
|       ^^^^^ second mutable borrow occurs here
8 | }
| - first borrow ends here

Rustの借用チェッカーには、スライスの異なる部分を借用していることが理解できないのです; 同じスライスから2回借用していることだけ知っています。

  • なるほどなー
  • だけど普通に変数を切り出せばよくね
    • 無理らしい
    • どうやっても2回可変に参照してしまうっぽい
  • cloneすればよくねと思ったが、長さがあまりにも長すぎるとだめらしい
    • そしたらシステムだけで扱うのが正しいかすら怪しいが
    • csvで外出しするとかね
use std::slice;

fn split_at_mut(slice: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
    let len = slice.len();
    let ptr = slice.as_mut_ptr();

    assert!(mid <= len);

    unsafe {
        (
            slice::from_raw_parts_mut(ptr, mid),
            slice::from_raw_parts_mut(ptr.offset(mid as isize), len - mid),
        )
    }
}
  • まあこれは本来ならResultで返せばいい感じがな

まとめ

#
  • わからんところをgeminiをつかってサクッと理解できた
  • だけどまだポインタ周りが雰囲気すぎるなー
  • 明日は実際に書いたほうがいいかも

次はここ

NO IMAGEUnsafe Rust - The Rust Programming Language 日本語版