我正在写一个分词器,为了方便起见,我写了一个Reader
对象,一次返回一个单词。当words
耗尽时,它从读BufReader
来填充words
。因此,我认为file
并且words
应该都存在于该结构中。
我遇到的问题是我想通过传递要标记化的字符串来测试它,而不必依赖文件。这就是为什么我尝试From
同时在aFile
和then&str
和上实现的原因String
。后两个不起作用(如下所示)。
我尝试Reader
使用生命周期进行注释,然后将其用于的实现From<&'a str>
,但这没有用。我最后得到了一个Reader<'a, T: Read>
,但是编译器抱怨没有任何使用过lifetime参数的东西。
另一种可行的实现方式From<&'static str>
可以正常工作,但这意味着传入的任何字符串都必须在静态生存期内存在。
我也看到了这个问题/答案,但是似乎有所不同,因为它们Enum
具有生命周期参数。
标题中有两个补充问题以及整体问题:
FromStr
,但是还没有尝试使用它-是否合适?我的最小示例在这里(省略了导入):
#[derive(Debug)]
struct Reader<T: Read> {
file: BufReader<T>,
words: Vec<String>,
}
impl From<File> for Reader<File> {
fn from(value: File) -> Self { // value moves into from
Reader::new(BufReader::new(value)) // value moves into BufReader(?)
}
}
// THE NEXT TWO DON'T WORK
impl From<&str> for Reader<&[u8]> {
fn from(value: &str) -> Self { // Compiler can't know how long the underlying data lives
Reader::new(BufReader::new(value.as_bytes())) // The data may not live as long as BufReader
}
}
impl From<String> for Reader<&[u8]> {
fn from(value: String) -> Self { // value moves into from
Reader::new(BufReader::new(value.as_bytes())) // value doesn't move into BufReader or Reader
} // value gets dropped
}
impl<T: Read> Reader<T> {
fn new(input: BufReader<T>) -> Self {
Self {
file: input,
words: vec![],
}
}
}
其中&str
一个使用生命周期注释进行编译(操场):
impl<'a> From<&'a str> for Reader<&'a [u8]> {
fn from(value: &'a str) -> Self {
Reader::new(BufReader::new(value.as_bytes()))
}
}
正如评论中所讨论的,您只需要注释引用,而不必尝试将生存期注释合并到Reader
自身中。
请注意,相同的方法行不通,String
因为将其签名from
移入函数,并且函数无法返回属于局部变量的字节。您可以为其实现&String
,但也可以使用&str
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句