首页 > 解决方案 > 如何在 Rust 中为 RNG 函数提供范围?

问题描述

我是编程新手,我被 Guessing Game 教程练习困住了。我正在尝试为 RNG 函数提供一个范围,但我可能做错了。我阅读了整个文档,但没有找到解决问题的方法。

这个想法很简单:

这是我写的代码:

use rand::Rng;
fn main() {

println!("\nChoississez votre niveau de difficulté\n
        A- Facile\n
        B- Normale\n
        C- Difficile\n");

let difficulte: String = read!();

let intervalle = match difficulte.as_str() {
    "A" => 1..=10,
    "B" => 1..=100,
    "C" => 1..=1000,
    _ => 1..=10000,
};

println!("\nDécouvrez un nombre entre {} et {}", intervalle.start(), intervalle.end());

let secret_number= rand::thread_rng().gen_range(intervalle.start()..intervalle.end());

println!("secret number {}", secret_number);

}

我收到该行的错误(gen.range 之后的所有内容):

let secret_number= rand::thread_rng().gen_range(intervalle.start()..intervalle.end());

这是错误:

特征界限&{integer}: rand::distributions::uniform::SampleUniform不满足

该特征rand::distributions::uniform::SampleUniform未实现&{integer}

如果我通过实际数字(例如 1 和 100)更改 intervalle.start() 和 intervalle.end() 一切正常。

我究竟做错了什么 ?

谢谢您的帮助

标签: rust

解决方案


问题是startandend方法返回引用而不是值,即 a&i32而不是 a i32。您可以通过取消引用返回值来解决此问题:

let secret_number = rand::thread_rng().gen_range(*intervalle.start()..*intervalle.end());
//                                               ^                    ^

*是解引用运算符。

intervalle但是,您可以直接传递intervalle给,而不是构造一个范围并将其存储在只是为了使用该范围的边界来构造另一个范围gen_range

let secret_number = rand::thread_rng().gen_range(intervalle);

推荐阅读