gpt4 book ai didi

rust - 如何在 Rust future 中赋予所有权

转载 作者:行者123 更新时间:2023-11-29 08:31:13 25 4
gpt4 key购买 nike

我有一个 Rust future 链,它需要在未来之外取得一个变量的所有权,但是,我不明白如何将变量的所有权传递给其中一个链。

问题似乎出在“let domain = DNSNameRef::try_from_ascii_str(&address).unwrap()”所使用的“address”变量上,因为用字符串替换 &address 会使它起作用。

我已经查找过将变量放入 Arc/Mutex 和 Rc/RefCell 中,但它们似乎没有帮助(也许我只是做错了)。我觉得我明白我需要基本上将所有变量的所有权交给 future 的闭包,因为它们将比当前函数长寿,但我不知道如何做到这一点......

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 - 如何在 Rust future 中赋予所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com