基本类型使用
hashmap 使用
1 使用 use std::collections::HashMap;
2新建哈希map
let mut scores = hashmap::new()
3 插入值
scores.insert(key,value)
4 只有建没有值下插入值
scores.entry(key).or_insert(value)
5 覆盖值
scores.insert(key,value)
6 获取map的值
onwerkey = String::from(key)
scores.get(&onwerkey)
hasher 是一个实现了 BuildHasher
trait
STRING的使用
字符串是 UTF-8 编码的,所以可以包含任何正确编码的数据
1新建字符串
let mut s = String::new();
2 存储
let hello = String::from("你好");
3 更新字符串
let mut s = String::from("foo")
方法1 s.pust_str("bar") 能push多个字符串
方法2 s.push("a") 只能push单个字符串
4 使用 +号进行拼接字符串
let s1 = String::from("Hello, "); let s2 = String::from("world!"); let s3 = s1 + &s2; // 注意 s1 被移动了,不能继续使用
首先,s2
使用了 &
,意味着我们使用第二个字符串的 引用 与第一个字符串相加。这是因为 add
函数的 s
参数:只能将 &str
和 String
相加,不能将两个 String
值相加。不过等一下 —— 正如 add
的第二个参数所指定的,&s2
的类型是 &String
而不是 &str
。那么为什么示例 8-18 还能编译呢?
之所以能够在 add
调用中使用 &s2
是因为 &String
可以被 强转(_coerced_)成 &str
。当 add
函数被调用时,Rust 使用了一个被称为 解引用强制转换(_deref coercion_)的技术,你可以将其理解为它把 &s2
变成了 &s2[..]
。第 15 章会更深入的讨论解引用强制转换。因为 add
没有获取参数的所有权,所以 s2
在这个操作后仍然是有效的 String
。
其次,可以发现签名中 add
获取了 self
的所有权,因为 self
没有 使用 &
。这意味着示例 8-18 中的 s1
的所有权将被移动到 add
调用中,之后就不再有效。虽然 let s3 = s1 + &s2;
看起来就像它会复制两个字符串并创建一个新的字符串,而实际上这个语句会获取 s1
的所有权,附加上从 s2
中拷贝的内容,并返回结果的所有权。换句话说,它看起来好像生成了很多拷贝,不过实际上并没有:这个实现比拷贝要更高效。
5 使用format进行拼接字符串
let ss = format!("{}-{}-{}",s1,s2,data);
6 内部表现
string是一个vec的封装
7 遍历字符串的方法
//需要操作单独的 Unicode 标量值
for c in "aa".chars() {
println!("{}",c);
}
//bytes 方法返回每一个原始字节,这可能会适合你的使用场景
for b in "नमस्ते".bytes() {
println!("{}", b);
}
* vector的使用
1 新建vec
let v: Vec<i32> = Vec::new();
2 更新vector
let mut v = Vec::new();
v.push(5);
v.push(6)
//无法使用println察看
let v = vec![1,2,3,4,5,6];
let third: &i32 = &v[2];
println!("third element is {}",third);
match v.get(2) {
Some(third) => println!("the third element is {}",third),
None => println!("there is no third element"),
}
4 遍历vector中的元素
let mut v = vec![100,2,33];
for i in &mut v {
// 遍历需要 &v
println!("{}",i);
*i += 50;
//如果需要修改,需要mut
println!("L2 is {}",i);
}
5 使用枚举来存储多种类型
enum SpreadsheetCell{
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreadsheetCell::Int(3),
];