获取字符串中的第一个单词,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
借用规则。