如何在 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)))
}

我不太确定为什么会这样。如果有人能解释一下,将不胜感激!