我试图生成一个包含小写ASCII字符的向量.这种更复杂的方法有效:

let ascii_lowercase = (b'a'..=b'z').map(|b| b as char).collect::<Vec<char>>();

但我一开始提出的这个更直接的方法并不是:

let ascii_lowercase = ('a'..='z').collect::<Vec<char>>();

错误是:

error[E0599]: no method named `collect` found for type `std::ops::RangeInclusive<char>` in the current scope
 --> src/main.rs:2:39
  |
2 |     let ascii_lowercase = ('a'..='z').collect::<Vec<char>>();
  |                                       ^^^^^^^
  |
  = note: the method `collect` exists but the following trait bounds were not satisfied:
          `std::ops::RangeInclusive<char> : std::iter::Iterator`
          `&mut std::ops::RangeInclusive<char> : std::iter::Iterator`

这很奇怪,因为据我所知,有blanket implementation of Iterator for RangeInclusive个.

作为一个不可能使用的字符范围?如果是,为什么?如果不是,我做错了什么?我使用的是stable Rust 2018 1.31.1.

推荐答案

EDIT 2020-07-17:自Rust 1.45.0以来,trait Step被用于char,使得Range<char>(以及其他一些字符范围)可以作为迭代器工作.问题中的代码现在编译没有问题!

下面是老答案.


表达式b'a'..=b'z'的类型是RangeInclusive<u8>(see on Playground),因为表达式b'a'的类型是u8:这就是字符文本前面的b的用途.另一方面,表达式'a'..='z'(不含bs)的类型为RangeInclusive<char>.

[...] 有一个IteratorRangeInclusive的全面实施.

首先,这不是我们所说的"整体实现"(当impl块为for Tfor &T(或类似)时,T是泛型类型).但是是的,有一个impl.但是让我们仔细看看:

impl<A> Iterator for RangeInclusive<A> 
where
    A: Step,   // <--- important

A: Step界很重要.正如您在the documentation for Step中看到的,这个特性适用于所有原始整数类型,但不适用于char.这意味着对字符没有明确的"添加一个"操作.是的,您可以将其定义为下一个有效的Unicode代码点,但Rust开发人员可能出于一个很好的理由决定不这么做.

结果,100 does not implement 101人死亡.

所以你的解决方案已经很好了.我可能会这样写:

(b'a'..=b'z').map(char::from).collect::<Vec<_>>()

唯一真正的优势是,在这个版本中,char不会出现两次.

Rust相关问答推荐

程序退出后只写入指定管道的数据

使用铁 rust S还原对多个数组执行顺序kronecker积

如何点击()迭代器?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

什么时候和为什么S最好是按值或引用传递简单类型

铁 rust ,我的模块介绍突然遇到了一个问题

try 从标准输入获取用户名和密码并删除 \r\n

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

在1.5n次比较中找到整数向量中的最大和次大整数

从光标位置旋转精灵

Rust 生命周期:这两种类型声明为不同的生命周期

Rust Serde 为 Option:: 创建反序列化器

打印 `format_args!` 时borrow 时临时值丢失

使用自定义 struct 收集 Vec

切片不能被 `usize` 索引?

为什么指定生命周期让我返回一个引用?

Cargo:如何将整个目录或文件包含在功能标志中?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?