Трейт 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,
который ограничивает обобщённые типы трейтами