目次

Rustの勉強[トレイト その4]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

  • 新年が始まった

  • トレイト最後だと思う

  • where句を使ったより明確なトレイト境界をやっている

前回の振り返り

#
  • トレイトはインターフェースではなく装備品だった

今日読む場所

#

お勉強

#

メモ

#
fn some_function<T: Display + Clone, U: Clone + Debug>(t: &T, u: &U) -> i32 {

これが

fn some_function<T, U>(t: &T, u: &U) -> i32
    where T: Display + Clone,
          U: Clone + Debug
{
  • こうなる

  • 読みやすくなるのは嬉しい

  • 気合で読む必要があるのかと思って辛かった

  • 戻り値にも impl Summaryが使える

  • 思ったよりもずっと直感的だ

    ジェネリックな型引数の境界で使用したい振る舞いを指定する方法がわかったので、リスト10-5に戻って、 ジェネリックな型引数を使用するlargest関数の定義を修正しましょう!最後にそのコードを実行しようとした時、 こんなエラーが出ていました:

$ cargo run
   Compiling chapter10 v0.1.0 (file:///projects/chapter10)
error[E0369]: binary operation `>` cannot be applied to type `T`
 --> src/main.rs:5:17
  |
5 |         if item > largest {
  |            ---- ^ ------- T
  |            |
  |            T
  |
  = note: `T` might need a bound for `std::cmp::PartialOrd`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0369`.
error: could not compile `chapter10`.

To learn more, run the command again with --verbose.
  • あ、そもそもジェネリクスでおおざっぱに指定すると怒られるんだ
  • だからトレイト境界を設けていると

    largestの別の実装方法は、関数がスライスのT値への参照を返すようにすることです。 戻り値の型をTではなく&Tに変え、それにより関数の本体を参照を返すように変更したら、 CloneやCopyトレイト境界は必要なくなり、ヒープ確保も避けられるでしょう。 これらの代替策をご自身で実装してみましょう!

  • &Tってなんだっけ???
  • 借用か、なぜ返してるんだろう

まとめ

#