РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
558 of 1245 menu

Трейт 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]

Смотрите также

  • трейт Trait,
    который описывает общее поведение типов
  • трейт AsMut,
    который предоставляет изменяемую ссылку на другой тип
  • трейт Borrow,
    который позволяет заимствовать значение в обобщённом коде
  • трейт Deref,
    который позволяет разыменовывать значение как ссылку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить