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