How do I include the end value in a range?

2019-01-07 00:42发布

I wanted to create a vector with 'a'..'z' values (inclusive).

This doesn't compile:

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

What's the idiomatic way to have 'a'..'z'?

标签: rust
2条回答
姐就是有狂的资本
2楼-- · 2019-01-07 00:53

Inclusive range feature stabilised and released as part of version 1.26. Below is valid syntax for inclusive range

for i in 1..=3 {
    println!("i: {}", i);
}
查看更多
等我变得足够好
3楼-- · 2019-01-07 01:18

Rust 1.26

As of Rust 1.26, you can use "inclusive ranges":

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

Rust 1.0 through 1.25

You need to add one to your end value:

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

This will not work if you need to include all the values:


However, you cannot iterate over a range of characters:

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>`

See Why can't a range of char be collected? for solutions.

I would just specify the set of characters you are interested in:

static ALPHABET: &str = "abcdefghijklmnopqrstuvwxyz";

for c in ALPHABET.chars() {
    println!("{}", c);
}
查看更多
登录 后发表回答