使用 TcpConnectionNew 时不满足特征绑定 `(): futures::Future`
The trait bound `(): futures::Future` is not satisfied when using TcpConnectionNew
我正在尝试使用 Tokio crate. My code is pretty close to this example 减去 TLS 在 Rust 中编写一个简单的 TCP 客户端:
extern crate futures;
extern crate tokio_core;
extern crate tokio_io;
use futures::Future;
use tokio_core::net::TcpStream;
use tokio_core::reactor::Core;
use tokio_io::io;
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let connection = TcpStream::connect(&"127.0.0.1:8080".parse().unwrap(), &handle);
let server = connection.and_then(|stream| {
io::write_all(stream, b"hello");
});
core.run(server).unwrap();
}
但是,编译失败并出现错误:
error[E0277]: the trait bound `(): futures::Future` is not satisfied
--> src/main.rs:16:29
|
16 | let server = connection.and_then(|stream| {
| ^^^^^^^^ the trait `futures::Future` is not implemented for `()`
|
= note: required because of the requirements on the impl of `futures::IntoFuture` for `()`
error[E0277]: the trait bound `(): futures::Future` is not satisfied
--> src/main.rs:20:10
|
20 | core.run(server).unwrap();
| ^^^ the trait `futures::Future` is not implemented for `()`
|
= note: required because of the requirements on the impl of `futures::IntoFuture` for `()`
我觉得很奇怪,因为根据the documentation应该执行。
我正在使用
- 生锈 1.19.0
- 期货 0.1.16
- 东京核心 0.1.10
- tokio-io 0.1.3
我错过了什么?
TL;DR: 删除 io::write_all
.
后的分号
查看 and_then
的定义:
fn and_then<F, B>(self, f: F) -> AndThen<Self, B, F>
where
F: FnOnce(Self::Item) -> B,
B: IntoFuture<Error = Self::Error>,
Self: Sized,
闭包 (F
) 必须 return 某种类型 (B
) 可以转换为具有匹配错误类型的未来 (B: IntoFuture
)起始闭包 (Error = Self::Error
).
你的闭包return是什么? ()
。这是为什么?因为您在行尾放置了一个分号 (;
)。 ()
没有implement the trait IntoFuture
,由错误信息部分"on the impl of futures::IntoFuture
for ()
":
表示
impl<F: Future> IntoFuture for F {
type Future = F;
type Item = F::Item;
type Error = F::Error;
}
删除分号将导致由 io::write_all
编辑的 Future
return 被 return 编辑回 and_then
并且程序将编译。
一般来说,期货通过将较小的组件组合在一起来工作,这些组件本身就是期货。所有这些共同构建了一个本质上是状态机的大未来。牢记这一点很好,因为在使用此类组合器时,您几乎总是需要 return 未来。
不幸的是,这里的答案非常具体,但问题出现在任何类型的搜索中:
the trait futures::Future
is not implemented for ()
这种错误的典型场景是:
foo.then(|stream| {
// ... Do random things here
final_statement();
});
这会导致错误,因为大多数 extension functions 需要 return 类型来实现 IntoFuture
。但是,()
没有实现 IntoFuture
,并且通过使用 ;
终止块,隐式 return 类型是 ()
.
但是,IntoFuture
是为Option
and Result
实现的。
与其只是随机删除分号,希望这会以某种方式神奇地编译您的代码,不如考虑:
你应该 returning 一些可以使用 IntoFuture
转换成 Future
的东西。
如果您没有 returning 的具体承诺,请考虑 returning Ok(())
从您的回调中简单地说 'this is done':
foo.then(|stream| {
// ... Do random things here
final_statement();
return Ok(()); // <-- Result(()) implements `IntoFuture`.
});
请特别注意,我用明确的 return 语句终止了这个块;这是故意的。这是 'can omit semicolon to implicitly return object' 人体工程学如何明显有害的典型示例;使用 Ok(());
终止块将继续失败并出现相同的错误。
我正在尝试使用 Tokio crate. My code is pretty close to this example 减去 TLS 在 Rust 中编写一个简单的 TCP 客户端:
extern crate futures;
extern crate tokio_core;
extern crate tokio_io;
use futures::Future;
use tokio_core::net::TcpStream;
use tokio_core::reactor::Core;
use tokio_io::io;
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let connection = TcpStream::connect(&"127.0.0.1:8080".parse().unwrap(), &handle);
let server = connection.and_then(|stream| {
io::write_all(stream, b"hello");
});
core.run(server).unwrap();
}
但是,编译失败并出现错误:
error[E0277]: the trait bound `(): futures::Future` is not satisfied
--> src/main.rs:16:29
|
16 | let server = connection.and_then(|stream| {
| ^^^^^^^^ the trait `futures::Future` is not implemented for `()`
|
= note: required because of the requirements on the impl of `futures::IntoFuture` for `()`
error[E0277]: the trait bound `(): futures::Future` is not satisfied
--> src/main.rs:20:10
|
20 | core.run(server).unwrap();
| ^^^ the trait `futures::Future` is not implemented for `()`
|
= note: required because of the requirements on the impl of `futures::IntoFuture` for `()`
我觉得很奇怪,因为根据the documentation应该执行。
我正在使用
- 生锈 1.19.0
- 期货 0.1.16
- 东京核心 0.1.10
- tokio-io 0.1.3
我错过了什么?
TL;DR: 删除 io::write_all
.
查看 and_then
的定义:
fn and_then<F, B>(self, f: F) -> AndThen<Self, B, F>
where
F: FnOnce(Self::Item) -> B,
B: IntoFuture<Error = Self::Error>,
Self: Sized,
闭包 (F
) 必须 return 某种类型 (B
) 可以转换为具有匹配错误类型的未来 (B: IntoFuture
)起始闭包 (Error = Self::Error
).
你的闭包return是什么? ()
。这是为什么?因为您在行尾放置了一个分号 (;
)。 ()
没有implement the trait IntoFuture
,由错误信息部分"on the impl of futures::IntoFuture
for ()
":
impl<F: Future> IntoFuture for F {
type Future = F;
type Item = F::Item;
type Error = F::Error;
}
删除分号将导致由 io::write_all
编辑的 Future
return 被 return 编辑回 and_then
并且程序将编译。
一般来说,期货通过将较小的组件组合在一起来工作,这些组件本身就是期货。所有这些共同构建了一个本质上是状态机的大未来。牢记这一点很好,因为在使用此类组合器时,您几乎总是需要 return 未来。
不幸的是,这里的答案非常具体,但问题出现在任何类型的搜索中:
the trait
futures::Future
is not implemented for()
这种错误的典型场景是:
foo.then(|stream| {
// ... Do random things here
final_statement();
});
这会导致错误,因为大多数 extension functions 需要 return 类型来实现 IntoFuture
。但是,()
没有实现 IntoFuture
,并且通过使用 ;
终止块,隐式 return 类型是 ()
.
但是,IntoFuture
是为Option
and Result
实现的。
与其只是随机删除分号,希望这会以某种方式神奇地编译您的代码,不如考虑:
你应该 returning 一些可以使用 IntoFuture
转换成 Future
的东西。
如果您没有 returning 的具体承诺,请考虑 returning Ok(())
从您的回调中简单地说 'this is done':
foo.then(|stream| {
// ... Do random things here
final_statement();
return Ok(()); // <-- Result(()) implements `IntoFuture`.
});
请特别注意,我用明确的 return 语句终止了这个块;这是故意的。这是 'can omit semicolon to implicitly return object' 人体工程学如何明显有害的典型示例;使用 Ok(());
终止块将继续失败并出现相同的错误。