如何在不先将其转换为字符串的情况下将char或&str附加到字符串?

时间:2018-11-26 00:42:58

标签: string rust

我正试图写一个词法分析器来找乐子,但是有些事情困扰着我。

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_stringString::from().to_owned进行转换等

我在做错什么事了吗,这样我就不必经常这样做,或者这是主要的附加方式吗?

2 个答案:

答案 0 :(得分:7)

如果您尝试使用某种类型的东西,请查阅文档。来自documentation for String

  • push:“将给定的char附加到此String的末尾。”
  • push_str:“将给定的字符串切片附加到此String的末尾。”

答案 1 :(得分:1)

重要的是要了解String&str之间的区别,以及为什么不同的方法接受并返回每个方法。

&str&mut strusually 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的方法,因此您执行此操作的方法可能是唯一的方法。