Функция replace
Функция replace из модуля std::ptr
заменяет значение, на которое указывает переданный
указатель, на новое значение и возвращает старое
значение. Первым параметром функция принимает
изменяемый сырой указатель *mut T, а вторым -
новое значение типа T. Функция помечена как
unsafe, потому что вызывающий обязан
гарантировать, что указатель действителен, выровнен
и указывает на инициализированное значение.
В отличие от обычного присваивания по указателю,
функция replace не уничтожает старое значение,
а возвращает его вызывающему коду. Это позволяет
безопасно извлечь значение, не копируя его и не
оставляя память в неинициализированном состоянии.
Синтаксис
unsafe fn replace<T>(dst: *mut T, src: T) -> T
Пример
Давайте создадим переменную, получим на неё
изменяемый указатель и заменим значение с помощью
функции replace:
fn main()
{
let mut value = 10;
let ptr = &mut value as *mut i32;
let old = unsafe { std::ptr::replace(ptr, 20) };
println!("old: {}", old);
println!("value: {}", value);
}
Результат выполнения кода:
old: 10
value: 20
Пример
Давайте применим функцию replace к элементу
массива по указателю:
fn main()
{
let mut arr = [1, 2, 3, 4, 5];
let ptr = &mut arr[2] as *mut i32;
let old = unsafe { std::ptr::replace(ptr, 100) };
println!("old: {}", old);
println!("arr: {:?}", arr);
}
Результат выполнения кода:
old: 3
arr: [1, 2, 100, 4, 5]
Пример
Давайте используем replace для замены строки
по указателю:
fn main()
{
let mut s = String::from("abcde");
let ptr = &mut s as *mut String;
let old = unsafe { std::ptr::replace(ptr, String::from("12345")) };
println!("old: {}", old);
println!("s: {}", s);
}
Результат выполнения кода:
old: abcde
s: 12345