为什么 `gen_range()` 中的“1..=100”返回一个范围而不是整数?

Jus*_*ter 3 rust

let secret_num = rand::thread_rng().gen_range(1, 101);
Run Code Online (Sandbox Code Playgroud)

但在官方文档中,代码是

let secret_num = rand::thread_rng().gen_range(1..=100);
Run Code Online (Sandbox Code Playgroud)

为什么它返回一个范围而不是整数。

完整代码

use std::io;
use std::cmp::Ordering;
use rand::Rng;
use colored::*;

fn main() {
    let secret_num = rand::thread_rng().gen_range(1..=100);
    println!("The secret number is {}", secret_num);

    println!("Guess the Number!");

    loop {

        println!("Please input you guess: ");

        let mut guess = String::new();


        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");
            
        println!("You guessed: {}", guess);

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,

        };
        
        match guess.cmp(&secret_num) {
            Ordering::Less => println!("{}", "Too small!".red()),
            Ordering::Greater => println!("{}", "Too big!".red()),
            Ordering::Equal => {
                println!("{}", "You win!".green());
                break;
            },

        }
    }
}


Run Code Online (Sandbox Code Playgroud)

caf*_*e25 6

您在使用某些旧版本时正在查看文档rand@0.8.x。该 API 的不同之处在于前者需要一个Range

fn gen_range<T, R>(&mut self, range: R) -> T
where
    T: SampleUniform,
    R: SampleRange<T>,
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

但您使用的旧版本需要 alowhigh绑定。

fn gen_range<T: SampleUniform, B1, B2>(&mut self, low: B1, high: B2) -> T
where
    B1: SampleBorrow<T> + Sized,
    B2: SampleBorrow<T> + Sized,
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,rust-analyzer 或您使用的任何内容都会推断T为 a Range,因为第一个参数low是类型B1: SampleBorrow<T> + Sized,(可以借用并返回对此处的引用TRange。如果您阅读进一步的错误,它还应该告诉您它仍然缺少第二个参数high