Метод as_ref
Метод as_ref преобразует значение в ссылку
на другой тип. Он особенно полезен, когда нужно
получить ссылку на внутренние данные без
перемещения или копирования значения. Метод
возвращает ссылку на целевой тип, а параметров
не принимает.
Метод as_ref доступен через типаж AsRef
и часто используется для написания обобщённого
кода, который принимает как владеющие значения,
так и ссылки на них.
Синтаксис
value.as_ref()
Метод возвращает ссылку &T, где T -
целевой тип, указанный в реализации типажа
AsRef.
Пример
Давайте получим ссылку на строку из типа
String с помощью метода as_ref:
fn main()
{
let s = String::from("abcde");
let r: &str = s.as_ref();
println!("{}", r);
}
Результат выполнения кода:
"abcde"
Пример
Давайте получим ссылку на срез из вектора
чисел с помощью метода as_ref:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let r: &[i32] = v.as_ref();
println!("{:?}", r);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте напишем функцию, которая принимает
обобщённый параметр AsRef<str> и работает
как со String, так и с &str:
fn print_len<S: AsRef<str>>(s: S)
{
println!("{}", s.as_ref().len());
}
fn main()
{
let owned = String::from("abcde");
print_len(owned);
print_len("12345");
}
Результат выполнения кода:
5
5
Пример
Давайте используем метод as_ref для
преобразования Box<str> в &str:
fn main()
{
let boxed: Box<str> = "abcde".into();
let r: &str = boxed.as_ref();
println!("{}", r);
}
Результат выполнения кода:
"abcde"