Метод to_owned
Метод to_owned создаёт owned-версию значения,
то есть преобразует заимствованные данные в данные,
которыми тип владеет самостоятельно. Метод не принимает
параметров и возвращает новое значение типа Self,
которое не связано с исходным заимствованием.
Метод to_owned объявлен в типаже ToOwned.
Он часто используется, когда нужно получить владеющую
версию среза &str - строку String,
или владеющую версию среза &[T] - вектор Vec<T>.
Синтаксис
value.to_owned()
Пример
Давайте преобразуем строковый срез "abcde"
в строку String с помощью метода to_owned:
fn main()
{
let slice: &str = "abcde";
let owned: String = slice.to_owned();
println!("{}", owned);
}
Результат выполнения кода:
"abcde"
Пример
Давайте проверим, что метод to_owned создаёт
независимую копию данных. Изменим исходный вектор после
создания owned-версии:
fn main()
{
let original = vec![1, 2, 3, 4, 5];
let owned = original.to_owned();
println!("{:?}", owned);
println!("{:?}", original);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Пример
Давайте преобразуем срез вектора &[i32]
в полноценный вектор Vec<i32>:
fn main()
{
let vec = vec![1, 2, 3, 4, 5];
let slice: &[i32] = &vec;
let owned: Vec<i32> = slice.to_owned();
println!("{:?}", owned);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте используем метод to_owned для создания
владеющей строки из среза, чтобы вернуть её из функции:
fn make_string(slice: &str) -> String
{
slice.to_owned()
}
fn main()
{
let res = make_string("12345");
println!("{}", res);
}
Результат выполнения кода:
"12345"
Смотрите также
-
типаж
Clone,
который создаёт копию значения -
метод
clone,
который клонирует значение через типаж Clone -
типаж
Cow,
который использует to_owned для получения владеющей версии -
метод
into_owned,
который преобразует Cow в owned-значение