我猜这是一个相当基础的Rust问题,但是我有一段这样的代码:
struct Stock<'a> {
name: &'a str,
value: u8,
}
impl<'a> Stock<'a> {
fn read(file: &mut File) -> Stock<'a> {
let mut value = vec![0; 1];
file.read(&mut value);
let name_size = read_u32(file);
let mut name = vec![0; name_size as usize];
file.read(&mut name);
return Stock {
name: str::from_utf8(&name).unwrap(),
value: value[0],
};
}
}
当然,它不起作用,因为我引用了一个本地值名称。据我所知,这是因为在
read
的范围之外,name
不存在。但是,from_utf8
会不会创建一个不受read
限制的新变量呢?此外,我读到一些其他人遇到这个问题的情况,并且建议总是切换到拥有的
String
。但是,为什么我不能做这样的事情: name: str::from_utf8(&name).unwrap().to_owned()
?
String
(以及其他一些改进)的示例:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e31965f9a799dc5aca26360538cf630f。 - trentname: str::from_utf8(&name).unwrap().to_owned()
? 是的,这会给你一个String
。我不确定我理解这里的反对意见。只需使用String
即可。 - trentto_owned
会给我一个String
:) 但是,你的回答确实帮了我很多(特别是代码示例)。我只需要完全理解它们。 - munHunger