Метод try_unwrap
Метод try_unwrap класса Arc пытается извлечь значение
из умного указателя, если на него больше нет других ссылок.
Он возвращает результат типа Result: вариант Ok
с извлечённым значением, если счётчик ссылок равен единице,
или вариант Err с тем же указателем Arc,
если ссылок больше одной.
Метод не принимает параметров и потребляет исходный указатель
Arc.
Синтаксис
Arc::try_unwrap(this)
Пример
Давайте создадим Arc с единственной ссылкой
и попробуем извлечь из него значение:
use std::sync::Arc;
fn main()
{
let arc = Arc::new(12345);
let res = Arc::try_unwrap(arc);
match res
{
Ok(value) => println!("{}", value),
Err(_) => println!("has multiple references"),
}
}
Результат выполнения кода:
12345
Пример
Давайте создадим Arc и клонируем его, чтобы ссылок стало
больше одной, после чего попробуем извлечь значение:
use std::sync::Arc;
fn main()
{
let arc = Arc::new("abcde");
let arc2 = Arc::clone(&arc);
let res = Arc::try_unwrap(arc);
match res
{
Ok(value) => println!("{}", value),
Err(_) => println!("has multiple references"),
}
println!("{}", arc2);
}
Результат выполнения кода:
has multiple references
"abcde"
Пример
Давайте создадим Arc, клонируем его, затем удалим клон
и попробуем извлечь значение снова:
use std::sync::Arc;
fn main()
{
let arc = Arc::new(12345);
let arc2 = Arc::clone(&arc);
drop(arc2);
let res = Arc::try_unwrap(arc);
match res
{
Ok(value) => println!("{}", value),
Err(_) => println!("has multiple references"),
}
}
Результат выполнения кода:
12345