Turbofi sh неправильно определяет тип - PullRequest
2 голосов
/ 04 апреля 2020

Я использую ящик mysql, в частности метод query_first . Выполнение следующего фрагмента кода отлично скомпилировано.

let foo : mysql::Result<Option<u64>> = tx.query_first("SELECT row_count();");

Для целей эргономии c я хочу встроить этот вызов на верхний уровень match, чтобы можно было протестировать несколько случаев. Чтобы вывести недостающий тип, я использую оператор turbofi sh (см. Следующий фрагмент). Однако это не компилируется.

match tx.query_first::<mysql::Result<Option<u64>>>("SELECT row_count();") {
  Ok(Some(num)) => {}
  Ok(None) => {}
  Err(e) => {}
};

Правильно ли я использую turbofi sh?

Ошибки компилятора:

error[E0107]: wrong number of type arguments: expected 2, found 1
   --> src/main.rs:224:22
    |
224 |             match tx.query_first::<mysql::Result<Option<u64>>>("SELECT row_count();") {
    |                      ^^^^^^^^^^^ expected 2 type arguments

error[E0277]: the trait bound `std::result::Result<std::option::Option<u64>, mysql::error::Error>: mysql_common::value::convert::FromValue` is not satisfied
   --> src/main.rs:224:22
    |
224 |             match tx.query_first::<mysql::Result<Option<u64>>>("SELECT row_count();") {
    |                      ^^^^^^^^^^^ the trait `mysql_common::value::convert::FromValue` is not implemented for `std::result::Result<std::option::Option<u64>, mysql::er
ror::Error>`
    |
    = note: required because of the requirements on the impl of `mysql_common::row::convert::FromRow` for `std::result::Result<std::option::Option<u64>, mysql::error::Err
or>`

1 Ответ

4 голосов
/ 04 апреля 2020

Поскольку функция query_first принимает два обобщенных параметра c, вы все равно должны указать два в нотации turbofi sh.

Другая проблема заключается в том, что вы переходите к turbofi sh неправильный тип: query_first возвращает Result<Option<T>>, поэтому, если вы хотите получить Result<Option<u64>>, T должно быть u64.

Объедините это вместе с игнорируемой привязкой _ ко второму тип, который позволяет компилятору выводить его, поэтому это должно работать (так как обобщенный c тип Q является вторым параметром):

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