获取字符串中的第一个单词,for 循环中的 &value 声明比较特殊,结合图1编译器的提示,value 是一个 u8 类型。
fn get_first_world(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &value) in bytes.iter().enumerate() {
if value == b' ' {
return &s[0..i];
}
}
&s[..]
}

如果将 &value 声明为 value,value的类型就变为 &u8,内部比较逻辑就需要对 value进行取值操作。

for 循环迭代返回的元素类型默认是 &i32,按照前面的思路,for 遍历参数声明为 &elem,elem的类型便是 i32。


两个例子中的 u8和i32都是基础数值类型,赋值过程不涉及所有权转移,&elem和elem 这两种声明方式没有本质区别。

数组元素是&str类型,for语句中elem的类型是&&str。如果for语句中的声明是&elem,那么,elem的类型就是&str。
不过,&str类型并不是我预期的,原本希望的是String类型,而非引用类型&str。下面显示指定nums元素类型为String。

程序正常通过编译。*elem为Strig类型,但占位符_没有发生所有权转移。下面尝试赋值给新的变量_f:

编译报错:cannot move out of *elem which is behind a shared reference。下面的遍历模式,报错信息也是如此。
不过,for循环中elem和&elem的区别在于elem自身类型不同,后续处理模式都相同。下图中elem虽然是String类型,却没有对应值的所有权,也就无法进行赋值操作。

下图例子通过HashMap实现单词计数的功能,其中,word类型是&str,count类型是&mut i32。count是指向HashMap关联值的可变引用,它的赋值过程符合RUST借用规则。




















