rust - 反复将变量传递给函数(改变所述变量)

标签 rust move-semantics ownership

我正在尝试使用 Rust,并且可能咬得太多了,我正在尝试编写一个模块来为应用程序的其余部分封装我的数据库流量。我正在努力处理的代码如下:

pub fn create_statement(cypher: &str, params: &HashMap<&str, &str>) -> rusted_cypher::Statement {
    let mut statement = rusted_cypher::Statement::new(cypher);
    for (field, value) in params.iter() {
        statement.with_param(field.to_owned(), value.to_owned());
    }
    return statement;
}

这会产生以下错误:error[E0382]: use of moved value: statement。我认为,我的搜索让我明白了这意味着什么(Statement 结构不可复制,因此被 move ,然后......实际上不再可访问,我猜?),但我'我不确定如何解决它。谁能指出解决方案的方向?

最佳答案

我以前没有使用过这个 API,但是根据 its documentation :

This method consumes self and returns it with the parameter added, so the binding does not need to be mutable.

正如您所说,结构不是“不可复制的”,而是 with_param方法是有意编写的,它 move 值并取得所有权——我们也可以说它消耗它。在构建器风格的 API 中使用该值是一件很常见的事情,因为它可以防止您意外地拥有半构建的对象。每个构建器方法都会使用该对象,在此期间没有其他任何东西可以访问它,然后在完成后返回它以便您可以继续使用它。来自文档:

let statement = Statement::new("MATCH n RETURN n")
    .with_param("param1", "value1")?
    .with_param("param2", 2)?
    .with_param("param3", 3.0)?;

每次调用 with_param消耗 statement然后返回它,这样你就可以调用 with_param再次。

这有点棘手的是 with_param 的结果不是 Statement ,而是一个 Result<Statement, JsonError> .显然,添加参数可能会导致错误,因此结果会被打包以适应这种可能性。这就是? s 用于 - 它们将结果解包为基础值,或者如果无法完成则传播错误。

正如已经建议的其他答案之一,更好的解决方法是只使用 set_parameters方法,这将一次性设置它们。

另一种方法是使用每次调用 with_param 的返回值:

pub fn create_statement(cypher: &str, params: &HashMap<&str, &str>) -> rusted_cypher::Statement {
  let mut statement = rusted_cypher::Statement::new(cypher);
  for (field, value) in params.iter() {
      statement = statement.with_param(field.to_owned(), value.to_owned()).unwrap();
  }
  statement
}

当您使用返回值时,您可以再次访问该值,因此您可以继续使用它。

注意我使用了 unwrap()Result 中获取值.这不是好的做法,因为如果结果是错误的,它会导致 panic 。我在这里这样做是为了专注于解释 move 语义,而不离题到错误处理,这本身就是一个主题。

关于rust - 反复将变量传递给函数(改变所述变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44904677/

相关文章:

api - 如何在返回 JSON 的 API 的多个调用之间添加换行符?

unix - 在 Rust 中获取准确时间的正确方法?

rust - 受本地定义的公共(public)特征约束的核心特征的全面实现

c++ - 在 move 构造函数中用作 arg 后,哪些 std 类型保证为空/空

c++ - move unique_ptr 后,指向 unique_ptr 内容的指针的内容是否有效?

函数参数的 C++ 所有权

linux - Mac 上的 Docker 分离了内部和外部文件所有权;在 Linux 上不是这样

Rust二叉树插入实现难度

rust - 如何将对象 "std::rand::task_rng()"传递给 Rust 中的函数?

function - 为什么不能将变量移出闭包?