rust - тип возврата из функции generi c с чертами - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь понять, как функции generi c работают в Rust. Вот мой код:

fn evaluate<T: std::ops::Mul>(portfolio: T, quote: T) -> T {
    portfolio * quote
}

И я получаю ошибку:

error[E0308]: mismatched types
  --> src/main.rs:10:5
   |
9  | fn evaluate<T: std::ops::Mul>(portfolio: T, quote: T) -> T {
   |                                                          - expected `T` because of return type
10 |     portfolio * quote
   |     ^^^^^^^^^^^^^^^^^ expected type parameter `T`, found associated type
   |
   = note: expected type parameter `T`
             found associated type `<T as std::ops::Mul>::Output`
   = note: you might be missing a type parameter or trait bound

Что я делаю не так?

1 Ответ

2 голосов
/ 26 марта 2020

Rust не предполагает, что умножение на значения типа T всегда приводит к новому значению типа T. Вместо этого черта Mul имеет связанный тип Output, который указывает тип возврата умножения. В сообщении об ошибке упоминается этот тип как «найден связанный тип <T as std::ops::Mul>::Output». Таким образом, самое простое решение состоит в том, чтобы изменить тип возвращаемого значения вашей функции на связанный тип:

fn evaluate<T: std::ops::Mul>(portfolio: T, quote: T) -> <T as std::ops::Mul>::Output {
    portfolio * quote
}

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

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