我是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
来阻止编译器抱怨“使用移动的变量”。这是惯用的吗?
答案 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
的唯一目的是将字符串传递给此函数,那么您的原始方法就完全可以了。