从 &str 数组获取 Iterator

2023-12-08

我正在尝试抽象一个函数来获取两个实例std::str::Lines以及用于测试目的的模拟版本,由一系列创建&str.

我的代码(确实有效)看起来像这样:

use std::fs;

#[test]
fn test_day_1() {
    let v = ["3", "3", "4", "-2", "-4"].iter().map(|x| *x);
    assert_eq!(day1(v), "334-2-4334-2-4");
}

fn day1_pre() -> String {
    let contents = fs::read_to_string("day1.txt").expect("error reading file");
    day1(contents.lines())
}

fn day1<'a>(lines: impl Iterator<Item = &'a str> + Clone) -> String {
    lines
        .map(|line| {
            let v: Result<i32, _> = line.parse();
            v.expect("could not parse line as integer")
        })
        .cycle()
        .take(10)
        .map(|x| x.to_string())
        .collect()
}

然而,这段代码之所以有效,是因为奇怪的.map(|x| *x)测试里面。如果我删除它,我会收到以下错误:

error[E0271]: type mismatch resolving `<std::slice::Iter<'_, &str> as Iterator>::Item == &str`
  --> src/lib.rs:6:16
   |
6  |     assert_eq!(day1(v), "334-2-4334-2-4");
   |                ^^^^ expected `str`, found `&str`
...
14 | fn day1<'a>(lines: impl Iterator<Item = &'a str> + Clone) -> String {
   |                                  -------------- required by this bound in `day1`
   |
   = note: expected reference `&str`
              found reference `&&str`

我有点理解这个错误。iter返回一个&T,在这种情况下会产生一个&&str。我不明白的是为什么要删除map并更换iter with into_iter (i.e. let v = ["3", "3", "4", "-2", "-4"].into_iter();)也因同样的错误而失败!

根据文档, into_iter迭代T,因此它应该在这里工作?

在写这篇文章时,我还尝试用Vec并使用into_iter,这样最终的结果就是let v = vec!["3","3","4","-2","-4"].into_iter();成功了!然而现在我更困惑了,为什么要into_iter为。。。工作Vec但不是为了Array?


这是与Rust 1.53 发行说明. IntoIteratorfor arrays 是在 1.53 中实现的新功能,但在 2018 和 2021 版本中的行为有所不同:

由于向后兼容性问题,此功能以前未实现。因为IntoIterator已经实现了对数组的引用,array.into_iter()已在早期版本中编译,解决(&array).into_iter().

从此版本开始,数组通过一个小的解决方法实现 IntoIterator 以避免破坏代码。编译器会继续解析array.into_iter() to (&array).into_iter(),就好像特征实现不存在一样。这仅适用于.into_iter()方法调用语法,并且不影响任何其他语法,例如for e in [1, 2, 3], iter.zip([1, 2, 3]) or IntoIterator::into_iter([1, 2, 3]),一切都编译得很好。

由于这个特殊情况对于.into_iter()只是为了避免破坏现有代码而需要,它在今年晚些时候发布的新版本 Rust 2021 中被删除。请参阅版本公告以获取更多信息。

因此你的代码将编译就好了与 Rust 2021

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 &str 数组获取 Iterator? 的相关文章

随机推荐

  • 通过 mod-rewrite 传递变量类型

    您好 我遇到了 htaccess mod rewrite 问题 也许这里有人可以指出正确的方向 我的网站有 1 个主文件 index php 所有导航都是通过在 url 字符串中传递 var 来完成的 例如 index php page a
  • 输入()错误 - NameError:名称“...”未定义

    当我尝试运行这个简单的脚本时出现错误 input variable input Enter your name print your name is input variable 假设我输入 dude 我得到的错误是 line 1 in
  • 服务器端的 SQLAlchemy 日期时间操作

    我有一个包含计划付款和过去付款的表 我需要查找同一周内是否对同一用户 合同进行了两次收费 select count from charge as c1 charge as c2 where c1 id contract c2 id cont
  • 使用 python scipy 正确插值 3D 矢量场

    GOAL 我的目标是使用 python 插值 3D 矢量场 CODE 原始向量场 import numpy as np import matplotlib pyplot as plt For interpolation from scipy
  • 如何将包含月份名称的日期字符串转换为日期时间?

    我确信这一定很简单 但是搜索引擎引导我的文章回答了除此之外的所有问题 我有一个字符串 13 February 2023 13 45 40 我需要将其转换为日期时间 以便我可以进行比较 你是如何安排这样的约会的 它是否需要一个比我更聪明的专业
  • 如何将文件从沙盒应用程序正确复制到应用程序脚本文件夹?

    我真的很困惑如何正确复制文件并授予执行权限 例如来自沙盒应用程序的 AppleScript 文件 我读过几篇文章和主题 但读得越多 我就越困惑 The Task 我的应用程序需要运行一个非常简单的AppleScript从一个 scpt文件
  • jboss6中log4j设置在哪里配置

    jboss 6 0 0 Final 似乎没有用于在 jboss5 中配置 log4j 设置的 jboss log4j xml 即在 server default conf jboss log4j xml 下 显然 自版本 6 以来 名称和位
  • 如何在Android操作栏开关中获取/设置操作事件

    我找到了这个帖子如何给android操作栏添加开关 这对我有用 但我无法获取它的事件 我正在使用 appcompat 并且我对 actionLayout 和 showAsAction 使用了应用程序命名空间 但我无法处理其对 onOptio
  • 根据模式将文件拆分为多个文件,并通过 Unix 中的搜索模式命名新文件?

    如何根据搜索模式拆分文件 并且将生成的新文件的文件名将等于用于拆分文件的搜索模式 目前 我正在使用以下命令来分割文件 awk GROUP x F i print gt x cdw all jobs reduced3 txt 它生成的文件名称
  • 使用 jQuery 和 Drupal6 自动更新宽度/长度/面积

    我正在使用 Drupal 创建测量表 Drupal 6 中的测量表 并且现在所有字段都已就位 我只需要编写一些 jQuery 在用户输入数据时自动更新相应的字段 代码如下 jQuery document ready function inp
  • 如何将列表分配为子列表,同时保持元素的原始顺序?

    如何将列表拆分为给定数量的列表 按顺序获取元素并将它们分配到子列表 因此不对列表进行分区 我想尽可能 好 地做到这一点 使用 Java 8 功能或 Guava 或类似的东西 示例列表 1 2 3 4 5 6 7 应分为 3 部分 1 4 7
  • 在 HTML 选择下拉选项中设置下拉元素的宽度

    我正在开发一个网站 该网站涉及使用 PHP 脚本自动填充选择框 这一切都工作正常 除了问题是我用来填充文本框的标题很长 它们是期刊文章和演示文稿标题 下拉框延伸到最长元素的宽度 该元素延伸到屏幕边缘 因此使滚动条无法到达 我尝试过各种方法尝
  • 使用 Postman 访问 OAuth 2.0 Google API

    我正在尝试访问邻近谷歌API using 邮递员 Chrome 应用程序 我已按照邮递员和谷歌开发网站上的教程进行操作 但仍然收到 401 错误消息 我在做什么 第 1 步 启用 Proximity API 为了使用 Proximity A
  • :app:processDebugResources 的executeTaskAction 失败

    我收到此错误消息 构建 构建失败 gt 运行构建 gt 运行任务 gt app processDebugResources gt executeTaskAction 下面显示的代码顺序为 错误消息 然后 build gradle Proje
  • 为什么Python中主进程退出时子进程(daemon=True)不退出?

    这是官方的解释daemonpython 多处理中的标志 当进程退出时 它会尝试终止其所有守护子进程 据我了解 父进程退出时会杀死其守护进程标志设置为 True 的子进程 下面是我用来证明我的猜测的代码 但结果不同 import multip
  • 打字稿条件:backend_layout(带幻灯片)

    我用这个条件 globalVar GP colPos 0 page backend layout pagets MainTemplate 我的问题是我的 子页面 没有选择 backend layout 因为设置了父页面 后端布局 此页面的子
  • C函数内存分配

    在 C 语言中 函数何时分配以及它在内存中的何处 函数的内存是在第一次编译程序时分配的 还是在第一次看到函数调用时分配的 它是分配在堆栈上还是在代码段中 你的问题问得很好 但是要做好应对一些额外复杂性的准备 因为其中一些东西会接触到运行代码
  • 使用 AutoHotKey 查找并填写输入字段

    对所有 AutoHotKey 大师的挑战 给我们一个函数查找并移动光标到输入字段 例如登录名 或者发送输入文本 对于像我这样又老又懒的黑客来说 只是摆弄 AHK 它看起来像这样 FindFillField elementid sendtex
  • Javascript Array.some() 和 Array.every() 相当于 Set?

    在 JavaScript 中 是否有等价的Array some and Array every 为了Set内置对象 不 唯一的内置方法Set prototype are Set prototype add Set prototype cle
  • 从 &str 数组获取 Iterator

    我正在尝试抽象一个函数来获取两个实例std str Lines以及用于测试目的的模拟版本 由一系列创建 str 我的代码 确实有效 看起来像这样 use std fs test fn test day 1 let v 3 3 4 2 4 i