Ошибка «метод and_then` не может быть вызван для объекта признака», когда аннотации типов добавляются в `and_then` - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть функция, переданная в and_then, которая возвращает тип, неизвестный компилятору.При связывании с другими опциональными методами требуются аннотации типов.

fn main() {
    let w = Some("hi".to_string());
    let x: Option<&String> = w.as_ref();

    //fails:
    let y: Option<String> =
        x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);

    //ok:
    let y: Option<String> = x.and_then(|_inner: &String| None);
}

детская площадка

Добавление обязательных аннотаций приводит к этой ошибке компилятора:

error: the `and_then` method cannot be invoked on a trait object
 --> src/main.rs:7:11
  |
7 |         x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);
  |           ^^^^^^^^

Я полагаю, что это жалоба на черту FnOnce, но я не понимаю, какое это имеет отношение к x.

Я бы хотел понять, что здесь происходит не так.

В конечном счете, цель состоит в том, чтобы иметь это and_then в цепочечном утверждении, поэтому аннотации необходимы.

let y = x
    .and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None)
    .and(Some("new String".to_string()));

1 Ответ

0 голосов
/ 07 декабря 2018

Здесь есть несколько проблем:

  • Закрытия имеют тип анонимный , что означает, что вы не можете назвать их .

  • В настоящее время невозможно иметь голую черту, такую ​​как FnOnce, потому что она не имеет размера .

  • || fooэто не черта, это конкретный тип.

Вместо этого указывает тип возвращаемого значения закрытия :

let y = x
    .and_then(|_inner| -> Option<String> { None })
    .and(Some("new String".to_string()));

Или уточняйте тип None:

let y = x
    .and_then(|_inner| None::<String>)
    .and(Some("new String".to_string()));

Или избегайте цепочки:

let y: Option<String> = x.and_then(|_inner| None);
let y = y.and(Some("new String".to_string()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...