Бесплатная библиотека
Читайте книгу на сайте или телефоне
Rust на примерах - Читать Любимую Русскую Полную Книгу 👉 Read-E-Book.com

Rust на примерах

Электронная книга - «Rust на примерах». Краткое содержание книги:

https://doc.rust-lang.ru/stable/rust-by-example/
1 ... 38 39 40 41 42 43 44 45 46 ... 92
Перейти на страницу:

use std::fmt::Debug;

trait PrintInOption {

fn print_in_option(self);

}

// Потому что в противном случае мы должны были бы выразить это как

// `T: Debug` или использовать другой метод косвенного подхода,

// для этого требуется утверждение `where`:

impl<T> PrintInOption for T where

Option<T>: Debug {

// Мы хотим использовать `Option<T>: Debug` как наше ограничение

// типажа, потому то это то, что будет напечатано. В противном случае

// использовалось бы неправильное ограничение типажа.

fn print_in_option(self) {

println!("{:?}", Some(self));

}

}

fn main() {

let vec = vec![1, 2, 3];

vec.print_in_option();

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

RFC, структуры, и типажи

New Type идиома

Идиома newtype гарантирует во время компиляции, что программе передаётся значение правильного типа.

Например, функция верификации возраста, которая проверяет возраст в годах должна получать значение типа Years.

struct Years(i64);

struct Days(i64);

impl Years {

pub fn to_days(&self) -> Days {

Days(self.0 * 365)

}

}

impl Days {

/// truncates partial years

pub fn to_years(&self) -> Years {

Years(self.0 / 365)

}

}

fn old_enough(age: &Years) -> bool {

age.0 >= 18

}

fn main() {

let age = Years(5);

let age_days = age.to_days();

println!("Old enough {}", old_enough(&age));

println!("Old enough {}", old_enough(&age_days.to_years()));

// println!("Old enough {}", old_enough(&age_days));

}

Удалите комментарий с последнего println, чтобы увидеть, что тип должен быть Years.

Чтобы получить из newtype-переменной значение базового типа, вы можете использовать кортежный синтаксис, как в примере:

struct Years(i64);

fn main() {

let years = Years(42);

let years_as_primitive: i64 = years.0;

}

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

struct

Ассоциированные элементы

"Ассоциированные элементы" относятся к набору правил, касающихся элементов различных типов. Это расширение для обобщённых типажей, которое позволяет им определить новый элемент внутри себя.

Каждый такой элемент называется ассоциированным типом и предоставляет упрощённый шаблон использования, когда trait является обобщённым для своего контейнера.

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

RFC

Проблема

trait, являющийся обобщённым для своего контейнера, есть требование к спецификации типа - пользователи trait должны специфицировать все обобщённые типы.

В примере ниже, trait Contains позволяет использовать обобщённые типы A и B. Затем этот типаж реализуется для типа Container, в котором A и B специфицированы, как i32, чтобы их можно было использовать в функции fn difference().

Потому что Contains имеет обобщение, мы должны явно указать все обобщённые типы для fn difference(). На практике, мы хотим выразить A и B через входной параметр C. Как вы можете увидеть в следующем разделе, ассоциированные типы предоставляют именно эту возможность.

struct Container(i32, i32);

// Типаж, который проверяет, сохранены ли 2 элемента в контейнере.

// Также он может вернуть первое или последнее значение.

trait Contains<A, B> {

fn contains(&self, _: &A, _: &B) -> bool; // Явно требует `A` и `B`.

fn first(&self) -> i32; // Не требует явного `A` или `B`.

fn last(&self) -> i32; // Не требует явного `A` или `B`.

1 ... 38 39 40 41 42 43 44 45 46 ... 92
Перейти на страницу:
0
Сюжет
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Атмосфера
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Главный герой
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
0
Общее впечатление
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Итоговая оценка: 0.0 из 10 (голосов: 0 / История оценок)