Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
561 of 1246 menu
◀ ▶

Трейт Borrow

Трейт Borrow позволяет заимствовать значение типа как ссылку на другой тип. Он определяет метод borrow, который возвращает ссылку на заимствованное значение. Параметром метод не принимает, а возвращает ссылку на тип Borrowed, указанный в определении трейта. Трейт Borrow часто используется в коллекциях для поиска значений по ключу, который может быть представлен разными типами.

Синтаксис

trait Borrow<Borrowed> where Borrowed: ?Sized, { fn borrow(&self) -> &Borrowed; }

Пример

Давайте рассмотрим базовый пример реализации трейта Borrow для пользовательской структуры, которая может заимствоваться как строка:

use std::borrow::Borrow; struct MyString { value: String, } impl Borrow<str> for MyString { fn borrow(&self) -> &str { &self.value } } fn main() { let s = MyString { value: String::from("abcde") }; let borrowed: &str = s.borrow(); println!("{}", borrowed); }

Результат выполнения кода:

"abcde"

Пример

Давайте рассмотрим использование трейта Borrow в стандартной коллекции HashMap для поиска значения по строковому ключу:

use std::collections::HashMap; fn main() { let mut map: HashMap<String, i32> = HashMap::new(); map.insert(String::from("key"), 42); let key: &str = "key"; let res = map.get(key); println!("{:?}", res); }

Результат выполнения кода:

Some(42)

Пример

Давайте рассмотрим разницу между трейтами Borrow и AsRef на примере функции, принимающей обобщённый параметр:

use std::borrow::Borrow; fn print_borrowed<T: Borrow<str>>(value: T) { let borrowed: &str = value.borrow(); println!("{}", borrowed); } fn main() { let s = String::from("12345"); print_borrowed(s); let s2 = "abcde"; print_borrowed(s2); }

Результат выполнения кода:

"12345" "abcde"

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

  • трейт AsRef,
    который предоставляет дешёвое преобразование по ссылке
  • трейт Deref,
    который позволяет разыменовывать значение как ссылку
  • трейт трейт,
    который описывает общее поведение типов
  • трейт trait bound,
    который ограничивает обобщённые типы трейтами
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить