一.字符串定义
1.Rust的字符串常常指的是String,str,还是一种是字符串字面值。str是字符切片,通常以&str的方式使用。
//String
let r_string:String = String::from("Hello rust string!");
//字符字面值定义的str
let r_str = "Hello rust str!";
2.String和&str默认是utf-8编码格式,而rust内置的char类型是4字节长度的,Unicode字符存储,所以Rust里面的字符串不能视为char类型的数组,而是更接近u8类型的数,使用utf-8的优点是跟ASCII码兼容,跟系统的大小端无法,更容易跨平台。
二.获取字符
1.因为rust用的utf-8编码格式,则是不允许使用索引访问字符串。
let r_string:String = String::from("Hello rust string!");
//下标访问
let s1 = r_string[1];
这里会报 Stringcannot be indexed by
{integer} 这个错误。
2.Rust不实现使用索引的方式是因为字符串索引应该返回的类型是不明确的: 字节值、字符、字形簇或者字符串切片; 使用索引获取 String 字符的原因是索引操作预期总是需要常数时间 (O(1))。但是对于 String 不可能保证这样的性能,因为 IDE不得不检查从字符串的开头到索引位置的内容来确定这里有多少有效的字符。
3.Rust提供另一种区间访问字符串的方式,使用索引的区间位置来切割字符。但必须按字符边界切割。
let e_string = String::from("Hello rust str!");
println!("{}",&e_string[0..1]);
这里会打印出首个字母H,但如果换成中文,这个区间下标就会引起恐慌。
let c_string:String = String::from("现实与理想");
println!("{}",&c_string[0..1]);
会报这个错误:thread ‘main’ panicked at ‘byte index 1 is not a char boundary; it is inside ‘现’ (bytes 0…3) of 现实与理想
’, src/main.rs:8:20
note: run with RUST_BACKTRACE=1
environment variable to display a backtrace ,因为一个中文字符占三个字节,必须按中文的字符的字符边界切割。
let c_string:String = String::from("现实与理想");
println!("{}",&c_string[0..3]);
这里会切出 “现”
4.关于区间访问,rust给了几个语法糖。
let s = String::from("Hello rust str!");
let s1 = &s[..5];//[0..5]
let s2 = &s[6..];//[6..(s.len()+1)]
let s3 = &s[..];//等于s
println!("{}\n{}\n{}", s1,s2,s3);
三.字符串之间转换
//声明一个字符串切片
let r_str:&str = "Hello rust str";
//str转String
let r_s1:String = r_str.to_string();
//字面值
let r_s2:String = "hello".to_string();
//String转str
let s:&str = &r_str;
//数字转String
let i = 12;
//变量
let r_s3:String = i.to_string();
//字面值
let r_s4:String = 13.to_string();
四.字符串拼接
1.push方法
let mut ss3 =String::from("String literals");
//把一个字符切片加到string
ss3.push_str(" add string");
//附加单个字符,要写单引号
ss3.push('L');
2.使用加号
//加号
let as1 = String::from("Hello");
let as2 = String::from(" World!");
//相加,第一个是原字符,第二是字符引用,相加后,第一个字符就失效(所有权问题)。
//第二字符串所有权被保留
let as3 = as1 + &as2;
3.format宏相加
//format!相加
let fos1 = String::from("one");
let fos2 = String::from("two");
let fos3 = String::from("three");
let fos4 = format!("{} {} {}",fos1,fos2,fos3);
println!("{}",fos4);