You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:25:39