Вариант Owned класса Cow
Вариант Owned класса Cow представляет
собой одну из двух возможных разновидностей этого
умного указателя. Cow расшифровывается как
Clone-on-Write (клонирование при записи) и позволяет
хранить либо заимствованные данные, либо собственные.
Вариант Owned соответствует случаю, когда
Cow владеет своими данными. Параметром
вариант принимает значение типа, которым владеет
умный указатель, например String или
Vec<T>.
Когда Cow находится в состоянии
Owned, любые изменения данных не требуют
клонирования, поскольку данные уже принадлежат
указателю. Это делает вариант Owned
удобным для случаев, когда нужно модифицировать
данные без дополнительных затрат на копирование.
Синтаксис
Cow::Owned(value)
Здесь value - это значение типа, которым
владеет Cow. Например, для
Cow<str> таким значением будет
String, а для Cow<[i32]> -
Vec<i32>.
Пример
Давайте создадим Cow в варианте
Owned и проверим, что он содержит
собственные данные:
use std::borrow::Cow;
fn main()
{
let cow: Cow<str> = Cow::Owned(String::from("abcde"));
println!("{}", cow);
println!("{}", cow.is_owned());
}
Результат выполнения кода:
"abcde"
true
Пример
Давайте создадим Cow с вектором в варианте
Owned и изменим его содержимое:
use std::borrow::Cow;
fn main()
{
let mut cow: Cow<[i32]> = Cow::Owned(vec![1, 2, 3, 4, 5]);
cow.to_mut().push(6);
println!("{:?}", cow);
}
Результат выполнения кода:
[1, 2, 3, 4, 5, 6]
Пример
Давайте сравним вариант Owned с вариантом
Borrowed, чтобы увидеть разницу между ними:
use std::borrow::Cow;
fn main()
{
let owned: Cow<str> = Cow::Owned(String::from("12345"));
let borrowed: Cow<str> = Cow::Borrowed("12345");
println!("{}", owned.is_owned());
println!("{}", borrowed.is_owned());
}
Результат выполнения кода:
true
false
Смотрите также
-
класс
Cow,
который представляет умный указатель с клонированием при записи -
вариант
Borrowed,
который хранит заимствованные данные -
метод
into_owned,
который преобразуетCowв собственное значение -
метод
to_owned,
который создает собственную копию данных