Тестовый случай: пустые ограничения

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании код демонстрирует, как трейты могут использоваться в качестве ограничений, даже если в трейтах не содержится никакой функциональности, на примере трейтов Eq и Copy.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Тестовый случай: пустые ограничения

Вследствие того, как работают ограничения, даже если trait не содержит никакой функциональности, вы по-прежнему можете использовать его в качестве ограничения. Eq и Copy - это примеры таких trait из стандартной библиотеки std.

struct Cardinal;
struct BlueJay;
struct Turkey;

trait Red {}
trait Blue {}

impl Red for Cardinal {}
impl Blue for BlueJay {}

// Эти функции действительны только для типов, которые реализуют эти
// трейты. Факт того, что трейты пустые, не имеет значения.
fn red<T: Red>(_: &T)   -> &'static str { "red" }
fn blue<T: Blue>(_: &T) -> &'static str { "blue" }

fn main() {
    let cardinal = Cardinal;
    let blue_jay = BlueJay;
    let _turkey   = Turkey;

    // `red()` не будет работать с голубым воробьем, и наоборот
    // из-за ограничений.
    println!("A cardinal is {}", red(&cardinal));
    println!("A blue jay is {}", blue(&blue_jay));
    //println!("A turkey is {}", red(&_turkey));
    // ^ TODO: Попробуйте раскомментировать эту строку.
}

Резюме

Поздравляем! Вы завершили лабораторное задание "Тестовый случай: пустые ограничения". Вы можете выполнить больше лабораторных заданий в LabEx, чтобы повысить свои навыки.