string - 从一个字符串中获取一个随机字符并附加到另一个字符串

标签 string rust

我正在尝试编写与以下 C++ 代码等效的 Rust:

result += consonants[rand() % consonants.length()];

它的意思是从字符串consonants中取出一个随机字符,并将其附加到字符串result中。

我似乎找到了一个有效的 Rust 等价物,但它……至少可以说是可怕的。什么是更地道的等价物?

format!("{}{}", result, consonants.chars().nth(rand::thread_rng().gen_range(1, consonants.chars().count())).unwrap().to_string());

最佳答案

一些事情:

  • 您不需要使用 format!()这里。有 String::push() 附加一个字符。

  • 还有 rand::sample() 可以从迭代器中随机选择多个元素的函数。这看起来非常合适!

那么让我们看看这是如何组合在一起的!我为不同的用例创建了三个不同的版本。

1。 Unicode 字符串(一般情况)

let consonants = "bcdfghjklmnpqrstvwxyz";
let mut result = String::new();

result.push(rand::sample(&mut rand::thread_rng(), consonants.chars(), 1)[0]);
//                                                                    |  |
//                             sample one element from the iterator --+  |
//                                                                       |
//                      get the first element from the returned vector --+

( Playground )

我们只从迭代器中采样一个元素,并立即将其插入字符串。仍然没有 C 的 rand() 短, 但请注意 rand() is considered harmful用于任何严肃用途!使用 C++ 的 <random> header 要好得多,但也需要更多代码。此外,您的 C 版本无法处理多字节字符(例如 UTF-8 编码),而 Rust 版本具有完整的 UTF-8 支持。

2。 ASCII 字符串

但是,如果您只想拥有一个包含英语辅音的字符串,则不需要 UTF-8,我们可以通过使用字节切片来使用 O(1) 索引:

use rand::{thread_rng, Rng};

let consonants = b"bcdfghjklmnpqrstvwxyz";
let mut result = String::new();

result.push(thread_rng().choose(consonants).cloned().unwrap().into());
//      convert Option<&u8> into Option<u8> ^^^^^^   
// unwrap, because we know `consonants` is not empty ^^^^^^
//                                   convert `u8` into `char` ^^^^

( Playground )

3。支持 Unicode 的字符集

如评论中所述,您可能只需要一组字符(“辅音”)。这意味着,我们不必使用字符串,而是使用 chars 的数组。 .所以这是最后一个支持 UTF-8 的版本并且避免了 O(n) 索引:

use rand::{thread_rng, Rng};

// If you need to avoid the heap allocation here, you can create a static
// array like this: let consonants = ['b', 'c', 'd', ...];
let consonants: Vec<_> = "bcdfghjklmnpqrstvwxyz".chars().collect();
let mut result = String::new();

result.push(*thread_rng().choose(&consonants).unwrap());

( Playground )

关于string - 从一个字符串中获取一个随机字符并附加到另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43436544/

相关文章:

C 将字符串/字符输入转换为 float

iphone - 如何根据字符串的长度分割字符串数组?

c++ - 为什么字符串末尾有一个问号?

java - java中的转义*字符

matrix - 是否可以从 ndarray 中获取不连续的切片?

generics - Rust 中 trait 的冲突实现

Python 正则表达式字符串提取

error-handling - 如何处理 Read::read_to_end 方法的错误?

unit-testing - 测试私有(private)函数的惯用方法是什么?

rust - 文档是否提到在函数参数前面添加 `mut` 关键字的可能性?