2015-03-29 11 views
13

PróbowałemJak mogę uzyskać losową liczbę w Rust 1.0?

use std::rand::{task_rng, Rng}; 

fn main() { 
    // a number from [-40.0, 13000.0) 
    let num: f64 = task_rng().gen_range(-40.0, 1.3e4); 
    println!("{}", num); 
} 

ale to daje

error[E0432]: unresolved import `std::rand::task_rng` 
--> rand.rs:1:17 
    | 
1 | use std::rand::{task_rng, Rng}; 
    |     ^^^^^^^^ no `task_rng` in `rand` 

error[E0432]: unresolved import `std::rand::Rng` 
--> rand.rs:1:27 
    | 
1 | use std::rand::{task_rng, Rng}; 
    |       ^^^ no `Rng` in `rand` 

error[E0603]: module `rand` is private 
--> rand.rs:1:17 
    | 
1 | use std::rand::{task_rng, Rng}; 
    |     ^^^^^^^^ 

error[E0603]: module `rand` is private 
--> rand.rs:1:27 
    | 
1 | use std::rand::{task_rng, Rng}; 
    |       ^^^ 

i starałem

extern crate rand; 
use rand::Rng; 

fn main() { 
    let mut rng = rand::thread_rng(); 
    if rng.gen() { 
     // random bool 
     println!("i32: {}, u32: {}", rng.gen::<i32>(), rng.gen::<u32>()) 
    } 
    let tuple = rand::random::<(f64, char)>(); 
    println!("{:?}", tuple) 
} 

i dostał

error[E0425]: cannot find function `thread_rng` in module `rand` 
--> rand.rs:5:29 
    | 
5 |   let mut rng = rand::thread_rng(); 
    |        ^^^^^^^^^^ not found in `rand` 
    | 
help: possible candidate is found in another module, you can import it into scope 
    |  use std::__rand::thread_rng; 

error[E0425]: cannot find function `random` in module `rand` 
    --> rand.rs:10:27 
    | 
10 |   let tuple = rand::random::<(f64, char)>(); 
    |       ^^^^^^ not found in `rand` 

error: use of unstable library feature 'rand': use `rand` from crates.io (see issue #27703) 
--> rand.rs:1:5 
    | 
1 |  extern crate rand; 
    |  ^^^^^^^^^^^^^^^^^^ 

error: use of unstable library feature 'rand': use `rand` from crates.io (see issue #27703) 
--> rand.rs:2:9 
    | 
2 |  use rand::Rng; 
    |   ^^^^^^^^^ 
+0

Pamiętaj, że jest to pytanie dla początkujących. To jest (po "Hello World") druga rzecz, którą próbowałem. –

Odpowiedz

19

W dalekiej przeszłościPakabył częścią standardowej biblioteki, ale już dawno został extracted to a crate. Ta skrzynka powinna być jedna użyć:

Określ Cargo.toml:

[package] 
name = "stackoverflow" 
version = "0.0.1" 
authors = ["A. Developer <[email protected]>"] 

[dependencies] 
rand = "0.3.15" # Or a newer version 

Wtedy twój przykładowy kod działa:

extern crate rand; 

use rand::Rng; 

fn main() { 
    let mut rng = rand::thread_rng(); 
    if rng.gen() { // random bool 
     println!("i32: {}, u32: {}", rng.gen::<i32>(), rng.gen::<u32>()) 
    } 
    let tuple = rand::random::<(f64, char)>(); 
    println!("{:?}", tuple) 
} 

z wyjściem:

$ cargo run 
    Running `target/debug/so` 
(0.310133, '\u{cd8fb}') 

$ cargo run 
    Running `target/debug/so` 
i32: 1568599182, u32: 2222135793 
(0.906881, '\u{9edc}') 

Dlaczego były te przydatne funkcje usunięte ze stdlib?

Rust ma filozofię umieszczania jak najwięcej w skrzyniach zamiast standardowej biblioteki. Dzięki temu każdy fragment kodu może rozwijać się i ewoluować w różnym tempie niż standardowa biblioteka, a także umożliwia zaprzestanie używania kodu bez wymuszania go na zawsze.

Typowym przykładem jest sequence of HTTP libraries in Python. Istnieje wiele pakietów, które wszystkie robią to samo na różne sposoby, a opiekunowie Pythona muszą przechowywać wszystkie z nich, aby zapewnić kompatybilność wsteczną.

Skrzynie pozwalają na uniknięcie tego konkretnego wyniku. Jeśli skrzynka naprawdę stabilizuje się przez długi czas, jestem pewien, że można ją ponownie dodać do standardowej biblioteki.

+2

Czy możesz wyjaśnić, dlaczego te przydatne funkcje zostały usunięte ze stdlib? –

Powiązane problemy