我是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来阻止编译器抱怨"使用移动的变量".这是惯用的吗?
这不是一个问题,这是否是惯用的,我相信; 你需要写什么取决于你想要达到的目标.
使用by-value self并String移出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是将字符串传递给此函数,那么您的原始方法就完全没问题了.
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |