Rust
Ö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.
Örnek çözümü göster
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);
}
Kendini test et
-
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
- Dilimler bölünemez
Cevabı göster
Derleyici aynı dilimden alınan iki &mut parçanın çakışmadığını kanıtlayamaz — İ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.
-
Ham parçadan dilim
slice::____(p.add(orta), n - orta)
Cevabı göster
slice::from_raw_parts_mut(p.add(orta), n - orta)
-
Grubun özeti
- unsafe { }
- Beş ek işlem
- *const / *mut
- Ham işaretçi
- extern "C"
- FFI
- assert! + unsafe
- Güvenli soyutlama
Sıradaki ders: extern bloğu