迭代器内的元素发生变化

2023-12-11

我想迭代作为成员包含在名为的结构中的向量内的一些元素Test。想法是要变异的Test在每次迭代中都是独立的,如果每次迭代中的某些外部逻辑发生变化,则表示成功Test是成功的。为简单起见,突变只是将向量元素更改为123u8。我遇到的问题是无法更改循环内的元素。我有两个解决方案,但我认为它们会给出相同的答案:

#[derive(Debug)]
struct Test {
    vec: Vec<u8>
}

impl Test {
    fn working_solution(&mut self, number: u8) -> bool {
        self.vec[0] = number;
        self.vec[1] = number;
        self.vec[2] = number;
        
        true
    }
    
    fn non_working_solution(&mut self, number: u8) -> bool {
        self.vec.iter().all(|mut x| {
            x = &number; // mutation
            true // external logic
        })
    }
}


fn main() {

    let vec = vec![0u8,1u8,2u8];
    let mut test = Test { vec };
    
    println!("Original: {:?}", test);
    test.working_solution(123u8);
    println!("Altered: {:?}", test);
    
    let vec = vec![0u8,1u8,2u8];
    let mut test = Test { vec };
    println!("Original: {:?}", test);
    test.non_working_solution(123u8);
    println!("Altered: {:?}", test);
}

(操场)

Output:

Original: Test { vec: [0, 1, 2] }
Altered: Test { vec: [123, 123, 123] }
Original: Test { vec: [0, 1, 2] }
Altered: Test { vec: [0, 1, 2] }

预期输出:

Original: Test { vec: [0, 1, 2] }
Altered: Test { vec: [123, 123, 123] }
Original: Test { vec: [0, 1, 2] }
Altered: Test { vec: [123, 123, 123] }

我如何更改会员self当使用迭代器时?


正如你在文档, ìter需要一个&self,也就是说,无论你做什么,你都无法修改self(您可以创建修改后的副本,但这不是您想要在此处执行的操作的重点)。

相反,您可以使用该方法iter_mut,或多或少相同,但需要一个&mut self,即您可以修改它。

另一边的评论,你不想使用all,用于检查所有元素上的属性是否为 true(因此bool返回),相反,你想使用for_each它将函数应用于所有元素。

fn non_working_solution(&mut self, number: u8) {
    self.vec.iter_mut().for_each(|x| {
        *x = number; // mutation
    })
}

(操场)


正如 Stargateur 在评论中提到的,您还可以使用 for 循环:

fn non_working_solution(&mut self, number: u8) {
    for x in self.vec.iter_mut() {
        *x = number
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代器内的元素发生变化 的相关文章

随机推荐

  • 在 javascript 警报中编写 php

    我用以下方式在JS中编写PHP alert echo Error login 关联一个xml 用symfony翻译成两种语言 但现在不起作用 我该如何解决 您缺少引号alert call alert
  • Ruby on Rails - 将模型中的字段添加到另一个模型的表单上

    我有两个型号Contract and Addendum 合同has many addendums和附录belongs to contract 创建新合同时 将自动创建新的附录 但需要一些额外的元素来创建新的附录 如何添加字段value 这是
  • Pandas 中的顺序组内枚举

    假设我有以下数据框 date A B C D 0 2014 03 20 1 561714 0 979202 0 454935 0 629215 1 2014 03 20 0 390851 0 045697 1 683257 0 771027
  • 将引用(工具>引用)与 VBA 代码(宏)连接

    我想使用 VBA 代码以编程方式将一些引用连接到我的 VBA 项目 即无需使用 工具 gt 引用 手动设置引用 这可能吗 例如 Microsoft Office 12 0 对象库 您没有提到 Office 应用程序 在 MS Access
  • 使用 malloc 时出错

    I pass char input from main to processInExp 函数 然后我再次传递它processInExp 功能为getInput 函数在读取文件时动态分配它 Inside getInput 功能input检查时
  • 为什么 ASP.NET 网站没有 Designer.cs?

    如果我们在 Visual Studio 中创建 ASP NET Web 应用程序 我们可以看到每个 aspx 文件都会有一个关联的自动生成的 aspx designer cs 文件 但对于 ASP NET 网站 每个 aspx 文件只有一个
  • 如何屏蔽具有 RepeatVector() 层的 LSTM 自动编码器中的输入?

    我一直在尝试使用 LSTM 自动编码器获取向量序列的向量表示 以便我可以使用 SVM 或其他此类监督算法对序列进行分类 数据量阻止我使用完全连接的密集层进行分类 我的输入的最短大小是 7 个时间步长 最长的序列是 356 个时间步长 因此
  • _vscprintf 在 Android 上等效吗?

    vscprintf在 Android 上不可用 还vsprintf NULL fmt ap 不起作用 产生段错误 因此似乎无法计算 vsnprintf 成功所需的缓冲区大小 Android sources表明 android log pri
  • “304 Not Modified”到底是如何工作的?

    304 Not Modified 响应是如何生成的 浏览器如何判断HTTP请求的响应是否为304 是浏览器设置的还是服务器发送的 如果由服务器发送 服务器如何知道缓存中可用的数据 以及如何将304设置为图像 我的猜测 如果它是由浏览器生成的
  • Git pre-commit hook:使用 -a 标志提交时如何获取添加/修改的文件

    当我使用 git commit a 提交我的工作时 预提交挂钩中的 git diff diff filter ACM name only cached 无法获取 git 将添加的文件 那么对于这种情况 正确的解决方案是什么 这里的问题是gi
  • 如何禁用/启用对话框负积极按钮?

    请查看下面的自定义对话框 我在对话框上有一个编辑文本字段 如果文本字段为空 我想禁用positiveButton 我可以为文本字段获取 charListener 但我不确定如何设置positivebutton禁用或启用该侦听器 正负按钮的参
  • Apache Flink:如何在摄取时间模式下获取事件的时间戳?

    我想知道是否可以使用Flink的摄取时间模式来获取记录的时间戳 考虑以下 flink 代码示例 https github com apache flink blob master flink examples flink examples
  • 在启用安全管理命令后,Glassfish 5 将无法启动

    输入enable secure admin 命令后 我无法运行 Glassfish 5 我有明确的操作系统 Ubutntu 服务器 16 04 然后我安装 java 8 并下载 zip 文件中的 glassfish 服务器 可能是什么问题呢
  • 如何使用 Graph-API 在 Facebook 中搜索特定位置的所有用户

    我有一个项目 我必须在 Facebook 上搜索所有人 特定位置 然后对数据应用进一步的过滤器 我的问题和问题是 如何使用 Graph API 获取初始数据 我知道这是可能的 使用 Facebook 本身的搜索字段 只需输入 所有居住在 的
  • 如何使用表面视图在用户不知情的情况下捕获图像?

    我想从 Android 相机捕获图像 但用户不知情 public class Capture extends Activity public Uri fileUri public String filepath1 public static
  • doGet 方法完成后 Servlet 是否返回响应?

    显然 doGet方法的返回类型为 void 因此 它不返回任何内容 从这个意义上说 我使用 返回 一词来表示将响应发送回请求它的客户端 我正在尝试实现一个长轮询 Servlet 在我有想要发回的内容之前不发送响应是有益的 因此 在 doGe
  • 我怎样才能让它在 android/iphone 上播放视频?

    update 1 我不太了解 但我想做的是通过 html5 在 android 手机上播放视频 正如其他人所说 我必须使用标签才能做到这一点 结束更新1 updated 这是我的 html 页面上的代码
  • 如何获取我的程序中单击的每个按钮的索引?

    所以我有一个双按钮数组 单击按钮后 我需要能够获取它的索引以用于进一步编码 这是一个类似扫雷的游戏 这是我到目前为止的代码 我有一个双 for 循环来为每个按钮创建一个 Handle 事件 但我不知道如何获取每个按钮的索引 我尝试过 e g
  • UINavigationBar 与 UISegmentedControl 部分覆盖 childViews

    我已经阅读了有关此内容和 Apple 文档的许多其他主题 但尚未找到针对我的特定问题的解决方案 我的应用程序使用UITabBarController as the rootViewController 在其中一个选项卡中我有一个UISegm
  • 迭代器内的元素发生变化

    我想迭代作为成员包含在名为的结构中的向量内的一些元素Test 想法是要变异的Test在每次迭代中都是独立的 如果每次迭代中的某些外部逻辑发生变化 则表示成功Test是成功的 为简单起见 突变只是将向量元素更改为123u8 我遇到的问题是无法