Как создать случайную строку путем выборки из буквенно-цифровых символов?

Я попытался скомпилировать следующий код:

extern crate rand; // 0.6
use rand::Rng;

fn main() {
    rand::thread_rng()
        .gen_ascii_chars()
        .take(10)
        .collect::<String>();
}

но cargo build говорит:

warning: unused import: `rand::Rng`
 --> src/main.rs:2:5
  |
2 | use rand::Rng;
  |     ^^^^^^^^^
  |
  = note: #[warn(unused_imports)] on by default

error[E0599]: no method named `gen_ascii_chars` found for type `rand::prelude::ThreadRng` in the current scope
 --> src/main.rs:6:10
  |
6 |         .gen_ascii_chars()
  |          ^^^^^^^^^^^^^^^

Компилятор Rust просит меня удалить use rand::Rng; пункт, в то же время жалуясь, что нет gen_ascii_chars метод. Я бы ожидал, что Rust просто использовать rand::Rng черта, а не предоставлять такие противоречивые сообщения об ошибках. Как я могу пойти дальше отсюда?

4 ответа

Как объяснено в ранде 0.5.0 документации gen_ascii_chars устарела.

Начиная с версии 0.6.0 код должен быть:

extern crate rand;
use rand::Rng; 
use rand::distributions::Alphanumeric;
fn main() {
    rand::thread_rng().sample_iter(&Alphanumeric).take(10).collect::<String>(); 
}

С введением rand 0.8.4,randтеперь содержитDistStringкоторый содержит более эффективный метод выборки случайной буквенно-цифровой строки. Пример из ранд-документов:

      use rand::distributions::{Alphanumeric, DistString};

let string = Alphanumeric.sample_string(&mut rand::thread_rng(), 16);
println!("{}", string);

Пример с пользовательской кодировкой иrandящик:

      use rand::Rng;
use std::iter;

fn generate(len: usize) -> String {
    const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    let mut rng = rand::thread_rng();
    let one_char = || CHARSET[rng.gen_range(0..CHARSET.len())] as char;
    iter::repeat_with(one_char).take(len).collect()
}

Вы можете использовать крейт случайных строк с вашей кодировкой. Вы можете установить его, включив random-stringбиблиотека в вашем Cargo.toml.

Взгляните на пример:

      // Import generate function
use random_string::generate;

// Your custom charset
let charset = "abcdefghijklmnopqrstuvwxyz";

// Syntax:
// random_string::generate(length, your_charset);

// Usage:
println!("{}", generate(6, charset));
Другие вопросы по тегам