如何在 Rust future 中赋予所有权
How to give ownership inside Rust future
我有一个 Rust 期货链,它需要在未来之外取得一个变量的所有权,但是,我不明白如何将变量的所有权传递给其中一个链。
问题似乎出在 'let domain = DNSNameRef::try_from_ascii_str(&address).unwrap()' 使用的 'address' 变量上,因为将 &address 替换为字符串将使其起作用。
我查找过将变量放入 Arc/Mutex 和 Rc/RefCell,但它们似乎没有帮助(也许我只是做错了)。我觉得我明白我需要基本上将所有变量的所有权交给未来的闭包,因为它们将比当前函数长寿,但我不知道该怎么做...
let address = inner.address().unwrap();
state.check_net(&address)?;
let op = resolve_addr(&address)
.and_then(move |socket_address| {
TcpStream::connect(&socket_address)
.map_err(ErrBox::from)
})
.and_then(move |socket| {
let mut config = ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let config = TlsConnector::from(Arc::new(config));
let domain = DNSNameRef::try_from_ascii_str(&address).unwrap();
config.connect(domain, socket)
.map_err(ErrBox::from)
})
.and_then(move |tls_stream| new_tls_conn(cmd_id, tls_stream));
if base.sync() {
let buf = op.wait()?;
Ok(Op::Sync(buf))
} else {
Ok(Op::Async(Box::new(op)))
}
我得到的错误是:
error[E0621]: explicit lifetime required in the type of `base`
--> ../../cli/ops.rs:1748:18
|
1716 | base: &msg::Base<'_>,
| -------------- help: add explicit lifetime `'static` to the type of `base`: `&msg::Base<'static>`
...
1748 | Ok(Op::Async(Box::new(op)))
| ^^^^^^^^^^^^ lifetime `'static` required
我似乎已经通过使用 address.to_owned()
基本上克隆 address
变量来使其工作,如下所示:
let address = inner.address().unwrap();
let domain = address.to_owned();
state.check_net(&address)?;
let op = resolve_addr(&address)
.and_then(move |socket_address| {
TcpStream::connect(&socket_address)
.map_err(ErrBox::from)
})
.and_then(move |socket| {
let mut config = ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let config = TlsConnector::from(Arc::new(config));
let domain = DNSNameRef::try_from_ascii_str(&domain).unwrap();
config.connect(domain, socket)
.map_err(ErrBox::from)
})
.and_then(move |tls_stream| new_tls_conn(cmd_id, tls_stream));
if base.sync() {
let buf = op.wait()?;
Ok(Op::Sync(buf))
} else {
Ok(Op::Async(Box::new(op)))
}
我不太确定为什么会这样。如果有人能解释一下,将不胜感激!
我有一个 Rust 期货链,它需要在未来之外取得一个变量的所有权,但是,我不明白如何将变量的所有权传递给其中一个链。
问题似乎出在 'let domain = DNSNameRef::try_from_ascii_str(&address).unwrap()' 使用的 'address' 变量上,因为将 &address 替换为字符串将使其起作用。
我查找过将变量放入 Arc/Mutex 和 Rc/RefCell,但它们似乎没有帮助(也许我只是做错了)。我觉得我明白我需要基本上将所有变量的所有权交给未来的闭包,因为它们将比当前函数长寿,但我不知道该怎么做...
let address = inner.address().unwrap();
state.check_net(&address)?;
let op = resolve_addr(&address)
.and_then(move |socket_address| {
TcpStream::connect(&socket_address)
.map_err(ErrBox::from)
})
.and_then(move |socket| {
let mut config = ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let config = TlsConnector::from(Arc::new(config));
let domain = DNSNameRef::try_from_ascii_str(&address).unwrap();
config.connect(domain, socket)
.map_err(ErrBox::from)
})
.and_then(move |tls_stream| new_tls_conn(cmd_id, tls_stream));
if base.sync() {
let buf = op.wait()?;
Ok(Op::Sync(buf))
} else {
Ok(Op::Async(Box::new(op)))
}
我得到的错误是:
error[E0621]: explicit lifetime required in the type of `base`
--> ../../cli/ops.rs:1748:18
|
1716 | base: &msg::Base<'_>,
| -------------- help: add explicit lifetime `'static` to the type of `base`: `&msg::Base<'static>`
...
1748 | Ok(Op::Async(Box::new(op)))
| ^^^^^^^^^^^^ lifetime `'static` required
我似乎已经通过使用 address.to_owned()
基本上克隆 address
变量来使其工作,如下所示:
let address = inner.address().unwrap();
let domain = address.to_owned();
state.check_net(&address)?;
let op = resolve_addr(&address)
.and_then(move |socket_address| {
TcpStream::connect(&socket_address)
.map_err(ErrBox::from)
})
.and_then(move |socket| {
let mut config = ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let config = TlsConnector::from(Arc::new(config));
let domain = DNSNameRef::try_from_ascii_str(&domain).unwrap();
config.connect(domain, socket)
.map_err(ErrBox::from)
})
.and_then(move |tls_stream| new_tls_conn(cmd_id, tls_stream));
if base.sync() {
let buf = op.wait()?;
Ok(Op::Sync(buf))
} else {
Ok(Op::Async(Box::new(op)))
}
我不太确定为什么会这样。如果有人能解释一下,将不胜感激!