我正试图写一个词法分析器来找乐子,但是有些事情困扰着我。
let mut chars: Vec<char> = Vec::new();
let mut contents = String::new();
let mut tokens: Vec<&String> = Vec::new();
let mut append = String::new();
//--snip--
for _char in chars {
append += &_char.to_string();
append = append.trim().to_string();
if append.contains("print") {
println!("print found at: \n{}", append);
append = "".to_string();
}
}
每次我想做一个简单的事情,例如将&str
附加到String
上时,都必须使用.to_string
,String::from()
,.to_owned
进行转换等
我在做错什么事了吗,这样我就不必经常这样做,或者这是主要的附加方式吗?
答案 0 :(得分:7)
如果您尝试使用某种类型的东西,请查阅文档。来自documentation for String
:
答案 1 :(得分:1)
重要的是要了解String
和&str
之间的区别,以及为什么不同的方法接受并返回每个方法。
&str
或&mut str
是usually preferred in function arguments并返回类型。这是因为它们只是数据的指针,因此传递时不需要复制或移动任何东西。
当函数需要进行一些新的分配时,将返回String
,而&str
和&mut str
是现有String
的切片。即使&mut str
是可变的,您也不能以增加其长度的方式对其进行突变,因为这将需要额外的分配。
trim
函数能够返回&str
切片,因为这不涉及变异原始字符串-修剪过的字符串只是一个子字符串,切片完美地描述了该子字符串。但是有时候这是不可能的。例如,用额外的字符填充字符串的函数将必须返回String
,因为它将分配新的内存。
您可以通过选择不同的方法来减少代码中类型转换的次数:
for c in chars {
append.push(c); // append += &_char.to_string();
append = append.trim().to_string();
if append.contains("print") {
println!("print found at: \n{}", append);
append.clear(); // append = "".to_string();
}
}
trim_in_place
并没有类似String
的方法,因此您执行此操作的方法可能是唯一的方法。