Ошибка ржавчины "невозможно определить тип для этого выражения" - PullRequest
0 голосов
/ 12 марта 2012

Я пишу простую программу ржавчины.

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
    send(s,str::bytes("hello world"));
};

есть ошибка на ней.

macmatoMacBook-Air-2:rust-http kula$ rustc http.rs
http.rs:40:4: 40:52 error: cannot determine a type for this expression
http.rs:40     result::chain(connect("localhost", port as u16)) {|s|
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous errors

что с ней произошло?

1 Ответ

4 голосов
/ 12 марта 2012

Компилятору не удалось определить тип, который должен возвращать этот вызов result::chain.Трудно сказать наверняка, не зная типов connect и send, но я думаю, это потому, что тело вашего лямбда-блока (вероятно, по ошибке) приводит к типу nil.

тип каждого блока в rust определяется его «выражением хвоста», а выражения хвоста создаются путем исключения точки с запятой в последнем выражении.Предположительно, send возвращает тип result, поэтому вы используете для него result::chain, так что результатом всего выражения является результат send.Для этого выражение send не должно заканчиваться точкой с запятой.Тогда ваш лямбда-блок вернет результат send.

Что-то вроде этого может работать лучше:

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
        send(s,str::bytes("hello world")) // <- no semicolon
    };
}

Когда вывод типа не удается, иногда бывает полезно разбить выражения на меньшие серииоператоров и вставьте явные типы, пока вы не выясните, где типы не совпадают правильно.Если бы я нажал на что-то вроде этого и не смог понять это, на некоторое время взглянув на него, то я бы начал переписывать это как

fn main(){
    let port = 80;
    let conn_result: result::t<connection, str> = connect("localhost", port as u16);
    let send_fn =  fn@(s: connection) -> result::t<str, str> {
        let send_result: result<str, str> = send(s,str::bytes("hello world"));
        ret send_result;
    };
    let res: result<str, str> = result::chain(conn_result, send_fn);
}

Конечно, заменяя любые типы connect и send, которые на самом деле используют,В какой-то момент в процессе разбора всего на части вы обнаружите, где вы и компилятор не согласны.

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