Компилятору не удалось определить тип, который должен возвращать этот вызов 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
, которые на самом деле используют,В какой-то момент в процессе разбора всего на части вы обнаружите, где вы и компилятор не согласны.