惯用借用

时间:2015-06-22 17:04:52

标签: rust

我是Rust的新手,并拥有以下工作代码。但我不认为我所做的是最好的方式。我正在寻找关于这段简单代码的见解。

我有一个包含一些数据的简单结构:

struct BlobRef {
    hashname: String,
}

impl BlobRef {
     fn hashname(self) -> String {
         self.hashname
     }
}

一个函数调用。不要担心source: &[u8],它会有时间发光。

fn write(bref: BlobRef, source: &[u8]) -> io::Result<String> {
    let hashname = bref.hashname();
    match fs::create_dir_all(&hashname) {
        Ok(_) => Ok(hashname),
        Err(e) => Err(e)
    }
}

我需要分配另一个范围变量hashname来阻止编译器抱怨“使用移动的变量”。这是惯用的吗?

1 个答案:

答案 0 :(得分:6)

这不是一个问题,这是否是惯用的,我相信;你需要写什么取决于你想要达到的目标。

使用按值self并将String移出结构,在进程中使用它(这是您的示例所做的)在某些情况下是完全合法的,完全取决于您的用例

另一方面,如果你只想获取字符串的值来在某处读取它(如你的例子所示),最好返回一个字符串切片:

impl BlobRef {
     fn hashname(&self) -> &str {
         &self.hashname
     }
}

现在你的第二段代码看起来像这样:

fn write(bref: &BlobRef, source: &[u8]) -> io::Result<String> {
    let hashname = bref.hashname();
    match fs::create_dir_all(hashname) {
        Ok(_) => Ok(hashname.into()),
        Err(e) => Err(e)
    }
}

这需要额外分配才能从String中获得&str

但是,如果BlobRef的唯一目的是将字符串传递给此函数,那么您的原始方法就完全可以了。