Rust中usize.clone()返回整数?为何克隆后for循环可正常运行?
问题解析与澄清
首先纠正几个关键误区:
你当前贴出的代码里,
match command的Command::Append(size)模式,已经将枚举成员中存储的usize值完整转移到size变量中了——size是拥有所有权的usize类型,根本不是引用。这时候直接写for i in 0..size完全可以正常编译,clone()是多余的操作。你之前遇到的编译错误“expected Integer but found &usize”,说明你当时的代码中拿到的是
&usize类型的引用。比如你可能写了Command::Append(ref size)(显式引用绑定),或者在其他场景下size是一个引用类型。
关于clone()的实际作用:usize实现了Clone trait,size.clone()会创建一个与原值完全相同的新usize实例,这个新实例的所有权完全独立于原size。循环使用这个克隆出的值时,是在使用新值的所有权,和原size的所有权没有任何转移关系——原size的所有权依然在你的代码中。
错误场景示例(你之前报错的情况)
如果你的代码是这样的(显式取引用):
pub enum Command { Uppercase, Trim, Append(usize), } fn some_fun(command: Command, string: String) { match command { // 这里用了ref,size是&usize类型 Command::Append(ref size)=> { let mut str = string.clone(); // 直接用0..size会报错,因为范围需要整数类型,不是引用 // for i in 0..size { ... } // 解决方式1:解引用 for i in 0..*size { str.push_str("bar"); } // 解决方式2:克隆出一个新的usize let s = size.clone(); for i in 0..s { str.push_str("bar"); } } _ => {} } }
总结
- 你当前贴的代码里不需要
clone(),直接用size即可; - 报错的根源是你当时拿到的是
&usize引用,而非拥有所有权的usize; clone()的作用是复制出一个新值,不是转移原变量的所有权。
内容的提问来源于stack exchange,提问作者WowBow
相关产品推荐
相关产品推荐

