CodeBlanks Logo Icon CodeBlanks

Özet - Unsafe Rust

unsafe bloğu ve ham işaretçileri birleştirerek split_in_two yazarsın.

Unsafe Rust özeti

unsafe beş ek işleme izin verir: ham işaretçi çözme, unsafe fn çağrısı, static mut erişimi, unsafe trait uygulama ve union okuma. Ödünç denetimi kapanmaz. Kurallar: unsafe'i küçük tut, her bloğu // SAFETY: ile gerekçelendir, unsafe fn'lerin sözleşmesini # Safety ile belgele ve dışarıya güvenli bir arayüz sun. Doğrulama için cargo miri test kullan.

Güvenli soyutlama: split_at_mut

Standart kütüphanedeki split_at_mut, unsafe ile kurulmuş güvenli bir soyutlamadır. Aynısını yazalım:

use std::slice;

fn ikiye_bol(v: &mut [i32], orta: usize) -> (&mut [i32], &mut [i32]) {
    let n = v.len();
    assert!(orta <= n);
    let p = v.as_mut_ptr();
    // SAFETY: [0, orta) ve [orta, n) ayrık ve v'nin sınırları içinde.
    unsafe {
        (
            slice::from_raw_parts_mut(p, orta),
            slice::from_raw_parts_mut(p.add(orta), n - orta),
        )
    }
}

assert!, sözleşmeyi çalışma anında garanti eder; fonksiyon bu yüzden güvenlidir.

Uygulama Kendi split_at_mut'ın

Yukarıdaki ikiye_bol fonksiyonunu yaz. let mut v = [1, 2, 3, 4, 5]; için ikiye_bol(&mut v, 2) ile iki parçayı al, ilk parçanın ilk elemanını 10, ikincinin ilk elemanını 30 yap ve v'yi yazdır.

Başlangıç kodu

main.rs
use std::slice;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::slice;

fn ikiye_bol(v: &mut [i32], orta: usize) -> (&mut [i32], &mut [i32]) {
    let n = v.len();
    assert!(orta <= n);
    let p = v.as_mut_ptr();
    // SAFETY: [0, orta) ve [orta, n) ayrık ve v'nin sınırları içinde.
    unsafe {
        (
            slice::from_raw_parts_mut(p, orta),
            slice::from_raw_parts_mut(p.add(orta), n - orta),
        )
    }
}

fn main() {
    let mut v = [1, 2, 3, 4, 5];
    let (a, b) = ikiye_bol(&mut v, 2);
    a[0] = 10;
    b[0] = 30;
    println!("{:?}", v);
}

Beklenen çıktı

[10, 2, 30, 4, 5]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Neden <code>split_at_mut</code> güvenli kodla yazılamaz?

  • &mut döndürülemez
  • Yazılabilir
  • Derleyici aynı dilimden alınan iki &mut parçanın çakışmadığını kanıtlayamaz Doğru cevap
  • Dilimler bölünemez

Açıklama: İnsan için açık olan (iki parça ayrık) derleyici için kanıtlanamaz; burada unsafe, kanıtı bizim sağlamamızı ister.

2 Ham parçadan dilim

Soru
slice::____(p.add(orta), n - orta)
Cevap
slice::from_raw_parts_mut(p.add(orta), n - orta)

Açıklama: from_raw_parts_mut işaretçi ve uzunluktan &mut [T] oluşturur.

3 Grubun özeti

Kavram Anlamı
unsafe { } Beş ek işlem
*const / *mut Ham işaretçi
extern "C" FFI
assert! + unsafe Güvenli soyutlama

İleri seviye bölümündeki tüm dersler