惯用借用

Ant*_*ter 2 rust

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

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

struct BlobRef {
    hashname: String,
}

impl BlobRef {
     fn hashname(self) -> String {
         self.hashname
     }
}
Run Code Online (Sandbox Code Playgroud)

和一个函数调用.不要担心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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*eev 6

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

使用by-value selfString移出struct,在进程中使用它(这就是你的例子所做的)在某些情况下是完全合法的,完全取决于你的用例.

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

impl BlobRef {
     fn hashname(&self) -> &str {
         &self.hashname
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要以获得额外拨款String出来的&str.

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