英文:
Rust unused import: `rand::Rng` and no method named `gen_range` found for struct `ThreadRng`
问题
以下是翻译好的内容:
我对Rust还很陌生。我正在尝试学习Rust中模块系统的工作原理,我尝试在文件的顶部像在Node.js或Python中一样导入rand
和io
。但是当我尝试在顶部导入rand
和io
时,我收到了以下错误消息:
unused import: rand::Rng
和 no method named gen_range found for struct ThreadRng
错误。
帮助
有人能解释一下,我如何像上面的错误示例中使用use
关键字以及问题的实质是什么吗?
我的猜测
由于我有JS和Python的经验,我猜想这与变量的作用域有关。但作用域的性质完全不同。所以有人能解释一下错误的原因是什么吗?
以下是两个代码示例。
有问题的代码:
use rand::Rng;
use std::io;
pub mod guess_game{
pub fn start(){
let random_generated_number = rand::thread_rng().gen_range(1, 10);
// 错误出现在这里 --------- ^ no method named `gen_range` found for struct `ThreadRng` in the current scope
items from traits can only be used if the trait is in scope
let mut user_input = String::new();
println!("Enter a number: ");
io::stdin()
// ^ a builtin type with a similar name exists: `i8`rustc E0433
.read_line(&mut user_input)
.expect("Error ayo hai ta");
let user_input_number:i32 = user_input.trim().parse().expect("Invalid integer provided");
println!("I see you entered {}", user_input);
if user_input_number == random_generated_number {
println!("RIGHT, You guessed it, {}", random_generated_number);
}else{
println!("WRONG!, You will have to guess {}", random_generated_number);
};
}
}
正确的代码
pub mod guess_game{
use rand::Rng;
use std::io;
pub fn start(){
let random_generated_number = rand::thread_rng().gen_range(1, 10);
let mut user_input = String::new();
println!("Enter a number: ");
io::stdin()
.read_line(&mut user_input)
.expect("Error ayo hai ta");
let user_input_number:i32 = user_input.trim().parse().expect("Invalid integer provided");
println!("I see you entered {}", user_input);
if user_input_number == random_generated_number {
println!("RIGHT, You guessed it, {}", random_generated_number);
}else{
println!("WRONG!, You will have to guess {}", random_generated_number);
};
}
}
英文:
I am new to rust. I am trying to learn how modular system works in rust and I tried to import rand
and io
at the top line of the file like I would have in nodejs or python. But when I tried to import the rand
and io
on top, I was getting the error as:
unused import: rand::Rng
and no method named gen_range found for struct ThreadRng
errors.
Help
Can anyone explain me, how can I work the use keyword as above like in the bugy code and what is the issue really about?
Guessed it
As I have experience in JS and python, I guessed it was related about something with the scoping of variables. But the nature of scoping is completely different. So can anyone explain to me what was the reason of the error.
Here are two codes.
Buggy Code:
use rand::Rng;
use std::io;
pub mod guess_game{
pub fn start(){
let random_generated_number = rand::thread_rng().gen_range(1, 10);
// Error was here --------- ^ no method named `gen_range` found for struct `ThreadRng` in the current scope
items from traits can only be used if the trait is in scope
let mut user_input = String::new();
println!("Enter a number: ");
io::stdin()
// ^ a builtin type with a similar name exists: `i8`rustc E0433
.read_line(&mut user_input)
.expect("Error ayo hai ta");
let user_input_number:i32 = user_input.trim().parse().expect("Invalid integer provided");
println!("I see you entered {}", user_input);
if user_input_number == random_generated_number {
println!("RIGHT, You guessed it, {}", random_generated_number);
}else{
println!("WRONG!, You will have to guess {}", random_generated_number);
};
}
}
Working code
pub mod guess_game{
use rand::Rng;
use std::io;
pub fn start(){
let random_generated_number = rand::thread_rng().gen_range(1, 10);
let mut user_input = String::new();
println!("Enter a number: ");
io::stdin()
.read_line(&mut user_input)
.expect("Error ayo hai ta");
let user_input_number:i32 = user_input.trim().parse().expect("Invalid integer provided");
println!("I see you entered {}", user_input);
if user_input_number == random_generated_number {
println!("RIGHT, You guessed it, {}", random_generated_number);
}else{
println!("WRONG!, You will have to guess {}", random_generated_number);
};
}
}
答案1
得分: 3
Modules do not have lexical visibility.
While Rust lets you create nested modules without creating new files the semantics don't change. That is, by design
mod foo {
// content here
}
and
mod foo;
// foo.rs
// content here
have exactly the same behavior, intentionally: it makes the implementation simpler, and lets you break up files by moving contents from nested modules into external files, and nothing more.
That means exactly as in Python, for one module to see the contents of another, you need some sort of cross-module import.
So your original code is exactly the same as:
// mod.rs
use rand::Rng;
use std::io;
pub mod guess_game;
// guess_game.rs
pub fn start(){
...
}
which in Python translates to:
# __init__.py
import random
import io
from . import guess_game
# guess_game.py
def start():
# uses random and io
Do you expect that to work? No? There's your answer.
英文:
> I am new to rust. I am trying to learn how modular system works in rust and I tried to import rand and io at the top line of the file like I would have in nodejs or python [...] Can anyone explain me, how can I work the use keyword as above like in the bugy code and what is the issue really about?
Modules do not have lexical visibility.
While Rust lets you create nested modules without creating new files the semantics don't change. That is, by design
mod foo {
// content here
}
and
mod foo;
// foo.rs
// content here
have exactly the same behaviour, intentionally: it makes the implementation simpler, and lets you break up files by moving contents from nested modules into external files, and nothing more.
That means exactly as in Python, for one module to see the contents of an other, you need some sort of cross-module import.
So your original code is exactly the same as:
// mod.rs
use rand::Rng;
use std::io;
pub mod guess_game;
// guess_game.rs
pub fn start(){
...
}
which in Python translates to:
# __init__.py
import random
import io
from . import guess_game
# guess_game.py
def start():
# uses random and io
Do you expect that to work? No? There's your answer.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论