gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:10:34 24 4
gpt4 key购买 nike

我正在尝试编写与以下 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com