如何在范围中包含末值?

25

我想创建一个包含'a'..'z'(包括这两个字符)的向量。

这段代码无法编译:

let vec: Vec<char> = ('a'..'z'+1).collect();

如何用惯用方式表示 'a'..'z'


z 的类型是否实现了 Add<usize> 接口?如果是的话,我认为你只需要使用 ('a'..('z'+1)),因为这是由于运算符优先级导致的。 - bright-star
@bright-star 不,不行:无法将二元运算符“+”应用于类型“char” - Shepmaster
哇,正如我刚发现的那样,('a'..'z').collect();也不起作用。Rust 1.17。看来我曾经使用过这个,但我不确定。 - bohdan_trotsenko
2个回答

37

Rust 1.26

从 Rust 1.26 开始,您可以使用“包含范围”:

fn main() {
    for i in 0..=26 {
        println!("{}", i);
    }
}

Rust 1.0 到 1.25 版本

你需要将结束值加一:

fn main() {
    for i in 0..(26 + 1) {
        println!("{}", i);
    }
}

如果你需要包括所有的值,这种方法是行不通的:


然而,你无法迭代字符范围:

error[E0277]: the trait bound `char: std::iter::Step` is not satisfied
 --> src/main.rs:2:14
  |
2 |     for i in 'a'..='z'  {
  |              ^^^^^^^^^ the trait `std::iter::Step` is not implemented for `char`
  |
  = note: required because of the requirements on the impl of `std::iter::Iterator` for `std::ops::RangeInclusive<char>`

请参考为什么无法收集char的范围?获取解决方案。

我只需要指定您感兴趣的字符集:

static ALPHABET: &str = "abcdefghijklmnopqrstuvwxyz";

for c in ALPHABET.chars() {
    println!("{}", c);
}

谢谢!有了你的提示,我最终使用了 let abc: Vec<char> = (b'a'..b'z' + 1).map(|c| c as char).collect();,因为没有 std::iter::Step - bohdan_trotsenko
更一般地说:(start as u32..end as u32 + 1).flat_map(std::char::from_u32) - Veedrac
为什么他们决定使范围的末尾变成不包含在内呢?这感觉非常不直观... - obe

6
版本 1.26 的一部分,包含范围功能已得到稳定并发布。以下是有效的包含范围语法。
for i in 1..=3 {
    println!("i: {}", i);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接