Класс Cow
Класс Cow (Clone-on-Write) - это перечисление
из модуля std::borrow, которое может хранить
либо заимствованные данные (Borrowed), либо
владеемые данные (Owned). Основная идея
заключается в том, что данные клонируются только
тогда, когда требуется их изменить. Параметром
тип Cow принимает тип, реализующий трейт
ToOwned. Это позволяет эффективно работать
с данными, избегая лишних аллокаций, когда
изменения не требуются.
Синтаксис
enum Cow<'a, B>
where
B: 'a + ToOwned + ?Sized,
{
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}
Пример
Давайте создадим Cow с заимствованной
строкой и выведем её на экран:
use std::borrow::Cow;
fn main()
{
let s = "abcde";
let cow: Cow<str> = Cow::Borrowed(s);
println!("{}", cow);
}
Результат выполнения кода:
"abcde"
Пример
Давайте создадим Cow с владеемой строкой
и выведем её на экран:
use std::borrow::Cow;
fn main()
{
let cow: Cow<str> = Cow::Owned(String::from("12345"));
println!("{}", cow);
}
Результат выполнения кода:
"12345"
Пример
Давайте продемонстрируем клонирование при
записи с помощью метода to_mut, который
при необходимости создаёт владеемую копию:
use std::borrow::Cow;
fn main()
{
let s = "abcde";
let mut cow: Cow<str> = Cow::Borrowed(s);
cow.to_mut().push_str("fgh");
println!("{}", cow);
}
Результат выполнения кода:
"abcdefgh"
Пример
Давайте получим владеемую строку из Cow
с помощью метода into_owned:
use std::borrow::Cow;
fn main()
{
let s = "12345";
let cow: Cow<str> = Cow::Borrowed(s);
let owned: String = cow.into_owned();
println!("{}", owned);
}
Результат выполнения кода:
"12345"
Смотрите также
-
перечисление
Borrowed,
которое представляет заимствованный вариант Cow -
перечисление
Owned,
которое представляет владеемый вариант Cow -
метод
to_owned,
который создаёт владеемую копию данных -
метод
into_owned,
который извлекает владеемые данные из Cow