Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ограничение трейта

При работе с обобщениями часто нужно требовать, чтобы типы реализовывали некоторый трейт, чтобы можно было вызывать его методы.

Это можно сделать с помощью T: Trait:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn duplicate<T: Clone>(a: T) -> (T, T) {
    (a.clone(), a.clone())
}

struct NotCloneable;

fn main() {
    let foo = String::from("foo");
    let pair = duplicate(foo);
    println!("{pair:?}");
}
This slide should take about 8 minutes.
  • Попробуйте создать NotCloneable и передать его в duplicate.

  • Когда нужно несколько трейтов, соедините их через +.

  • Покажите предложение where: студенты встретятся с ним при чтении кода.

    // Copyright 2022 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn duplicate<T>(a: T) -> (T, T)
    where
        T: Clone,
    {
        (a.clone(), a.clone())
    }
    • Оно разгружает сигнатуру функции, если параметров много.
    • У него есть дополнительные возможности, которые делают его мощнее.
      • Если кто-то спросит, дополнительная возможность в том, что тип слева от «:» может быть произвольным, например Option<T>.
  • Обратите внимание, что Rust пока не поддерживает специализацию. Например, при исходной duplicate добавить специализированную duplicate(a: u32) некорректно.