将变量重复传递给函数(它会改变所述变量)

时间:2017-07-04 11:23:35

标签: rust move-semantics ownership

我正在玩Rust,并且可能咬得比我咀嚼的要多得多,我正在尝试编写一个模块来封装我应用程序其余部分的数据库流量。我挣扎的代码如下:

Statement

这会出现以下错误:\s(\{\{([^\{\}]+?)\}\})\s。我认为,我的搜索引导了我的意思(Process p = Runtime.getRuntime().exec( System.getenv("windir") + "\\system32\\" + "tasklist.exe /v /FI \"STATUS eq RUNNING\""); 结构不可复制,因此被移动,然后......实际上不再可访问,我猜?),但我是不知道如何解决它。有人能指出我的解决方案吗?

2 个答案:

答案 0 :(得分:5)

我之前没有使用过此API,但根据its documentation

  

此方法使用self并使用添加的参数返回它,因此绑定不需要是可变的。

正如你所说,结构不是可复制的",with_param方法是故意以这样的方式编写的。 移动值并取得所有权 - 我们也可以说它消费它。在构建器样式的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>。显然添加参数可能会导致错误,因此结果将被包装以适应这种可能性。这就是?的用途 - 它们将结果解包到基础值中,否则如果无法完成则传播错误。

正如已经建议的其他答案之一,更好的解决方法是使用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获取了值。这是良好做法,因为如果结果是错误,它会引起恐慌。我在这里做了这个,专注于解释移动语义而不是错误处理,这本身就是一个主题。

答案 1 :(得分:1)

虽然这并没有回答关于以与当前代码相同的方式传递可变值的基本问题。

rusted-cypher::Statement有一个set_parameters方法,它以&BTreeMap<String, T>为唯一参数。

您可以在rusted-cypher's source code

中看到此功能

可以想象的实施:

pub fn create_statement(cypher: &str, params: &BTreeMap<&str, &str>) -> rusted_cypher::Statement {
   let mut statement = rusted_cypher::Statement::new(cypher);
   statement.set_parameters(params);
   statement
}