先说明一下,在Rust中,字符是UniCode编码占4个字节,字符串类型的字符是UTF-8编码的,字节大小为1~3。
字符串类型在Rust中,可以分为&Str和String类型
&Str类型是不可修改的字符串
String 则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串
fn main() {
let s1 = String::from("hello");
let h = s1[2];
}
这样会报错,因为字符串编码是可变长编码,通过简单的下标,很难界定你输入的下标是否正确切割了字符
--> src/main.rs:4:14
|
4 | let h = s1[2];
| ^ `String` cannot be indexed by `{integer}`
|
= help: the trait `Index<{integer}>` is not implemented for `String`
= help: the following other types implement trait `Index<Idx>`:
<String as Index<RangeFull>>
<String as Index<std::ops::Range<usize>>>
<String as Index<RangeFrom<usize>>>
<String as Index<RangeTo<usize>>>
<String as Index<RangeInclusive<usize>>>
如果我们就是想获得字符串的一部分,我们可以通过字符串切片来获取,但是我们的下标要注意,要整好取得字符字节大小的整数。
fn main() {
let hello = "中国人";
let s = &hello[0..3];
println!("{}",s);
}
Compiling world_hello v0.1.0 (/Users/guilinhuang/Desktop/RustProject/world_hello)
Finished release [optimized] target(s) in 0.21s
Running `target/release/world_hello`
中
在字符串尾部可以使用 push() 方法追加字符 char,也可以使用 push_str() 方法追加字符串字面量。这两个方法都是在原有的字符串上追加,并不会返回新的字符串。由于字符串追加操作要修改原来的字符串,则该字符串必须是可变的,即字符串变量必须由 mut 关键字修饰
fn main() {
let mut s = String::from("Hello ");//mut关键字修饰,使得s拥有的值可以被修改
s.push_str("rust");
println!("追加字符串 push_str() -> {}", s);
s.push('!');
println!("追加字符 push() -> {}", s);
}
追加字符串 push_str() -> Hello rust
追加字符 push() -> Hello rust!
fn main() {
let mut s = String::from("Hello rust!");
s.insert(5, ',');
println!("插入字符 insert() -> {}", s);
s.insert_str(6, " I like");
println!("插入字符串 insert_str() -> {}", s);
}
插入字符 insert() -> Hello, rust!
插入字符串 insert_str() -> Hello, I like rust!
fn main() {
let mut string_pop = String::from("rust pop 中文!");
let p1 = string_pop.pop();
let p2 = string_pop.pop();
dbg!(p1);
dbg!(p2);
dbg!(string_pop);
}
p1 = Some(
'!',
)
p2 = Some(
'文',
)
string_pop = "rust pop 中"
fn main() {
let mut string_remove = String::from("测试remove方法");
println!(
"string_remove 占 {} 个字节",
std::mem::size_of_val(string_remove.as_str())
);
// 删除第二个汉字
string_remove.remove(3);
// 下面代码会发生错误
// string_remove.remove(1);
dbg!(string_remove);
}
string_remove 占 18 个字节
[src/main.rs:13:3] string_remove = "测remove方法"
fn main() {
let mut string_truncate = String::from("测试truncate");
string_truncate.truncate(3);
dbg!(string_truncate);
}
string_truncate = "测"
fn main() {
let string_replace = String::from("I like rust. Learning rust is my favorite!");
let new_string_replace = string_replace.replace("rust", "RUST");
dbg!(new_string_replace);
}
new_string_replace = "I like RUST. Learning RUST is my favorite!"
fn main() {
let mut string_replace_range = String::from("我 like rust!");
string_replace_range.replace_range(0..3, "R");
dbg!(string_replace_range);
}
[src/main.rs:4:3] string_replace_range = "R like rust!"
fn main() {
let mut string_clear = String::from("string clear");
string_clear.clear();
dbg!(string_clear);
}
string_clear = ""
fn main() {
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
// String = String + &str + &str + &str + &str
let s = s1 + "-" + &s2 + "-" + &s3;
print!("{}",s1);
}
--> /Users/guilinhuang/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/arith.rs:91:12
|
91 | fn add(self, rhs: Rhs) -> Self::Output;
| ^^^^
= note: this error originates in the macro `$crate::format_args` which comes from the expansion of the macro `print` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable
|
7 | let s = s1.clone() + "-" + &s2 + "-" + &s3;
| ++++++++