String 如何生成字母数字字符的随机字符串?
问题的第一部分可能非常常见,有足够的代码示例解释如何生成随机的字母数字字符串。我使用的代码片段来自String 如何生成字母数字字符的随机字符串?,string,random,utf-8,rust,char,String,Random,Utf 8,Rust,Char,问题的第一部分可能非常常见,有足够的代码示例解释如何生成随机的字母数字字符串。我使用的代码片段来自 使用rand:{thread\u rng,rng}; 使用rand::distributions::字母数字; fn main(){ 让rand\u string:string=thread\u rng() .示例(字母和数字) .take(30) .收集(); println!(“{}”,rand_字符串); } 但是,这段代码不会编译(注意:我每天晚上都在上): error[E0277]:无
使用rand:{thread\u rng,rng};
使用rand::distributions::字母数字;
fn main(){
让rand\u string:string=thread\u rng()
.示例(字母和数字)
.take(30)
.收集();
println!(“{}”,rand_字符串);
}
但是,这段代码不会编译(注意:我每天晚上都在上):
error[E0277]:无法通过迭代器在`u8类型的元素上生成`String`类型的值`
-->src/main.rs:8:10
|
8 |收集();
|无法从'std::iter::Iterator'生成'String'类型的值`
|
=帮助:`String'未实现特性`FromIterator``
好的,生成的元素类型为u8
。我猜这是u8
的数组或向量:
使用rand:{thread\u rng,rng};
使用rand::distributions::字母数字;
fn main(){
设r=螺纹
.示例(字母和数字)
.take(30)
收集::();
设s=String::from_utf8_lossy(&r);
println!(“{}”,s);
}
这是编译和工作
2dCsTqoNUR1f0EzRV60IiuHlaM4TfK
一切都很好,只是我想问一下,是否有人可以解释关于类型的具体情况以及如何优化
问题
.sample\u iter(&字母数字)
生成u8
而不是char
ss
并直接将u8
解释为utf-8字符?我猜记忆中的表示形式根本不会改变Vec
之外的堆分配?此外,它们实际上可能是char[]
而不是String
srand::distributions::Alphanumeric
显示,如果要将u8
s转换为char
s,则应使用char::from
函数映射它们:
使用rand:{thread\u rng,rng};
使用rand::distributions::字母数字;
fn main(){
让rand\u string:string=thread\u rng()
.示例(字母和数字)
.map(char::from)//在此处添加了映射
.take(30)
.收集();
println!(“{}”,rand_字符串);
}
.sample\u iter(&字母数字)
产生u8而不是字符
是的,在rand v0.8中进行了更改:
字母数字的impl分布
:
字母数字的impl分布
如何避免第二个变量s
并直接将u8
解释为utf-8字符?我猜记忆中的表示形式根本不会改变
有几种方法可以做到这一点,最明显的是将每个u8
转换为char
:
让s:String=thread\u rng()
.示例(字母和数字)
.take(30)
.map(| x | x作为字符)
.收集();
或者,使用:
让s:String=thread\u rng()
.示例(字母和数字)
.take(30)
.map(char::from)
.收集();
当然,在这里,因为您知道每个u8
必须是有效的UTF-8,所以可以使用,它比\u utf8\u lossy中的更快(尽管可能与as char
方法的速度差不多):
让s=不安全{
字符串::from_utf8_未选中(
线程_rng()
.示例(字母和数字)
.take(30)
收集::(),
)
};
如果由于某种原因,不安全
困扰了你,你想保持安全,那么你可以使用较慢的打开结果
,这样你会得到恐慌而不是UB(即使代码不应该恐慌或UB):
让s=String::from_utf8(
线程_rng()
.示例(字母和数字)
.take(30)
收集::(),
).unwrap();
这些字符串的长度应始终为30。如何优化Vec
之外的堆分配?此外,它们实际上可以是char[]
而不是字符串
首先,相信我,你不需要字符数组。和他们一起工作并不有趣。如果需要堆栈字符串,请使用u8
数组,然后使用类似或更快的函数(同样,仅可使用,因为您知道将生成有效的utf8)
关于优化堆分配,请参阅。基本上,这是不可能的,只要有一点粗俗/丑陋(例如,制作自己的函数,将迭代器收集到一个包含30个元素的数组中)
一旦它们最终稳定下来,就会有一个更漂亮的解决方案。我想你应该提到一个可能的原因,让你更喜欢Vec
而不是Vec
:char
总是4字节长,这意味着对于任何ASCII字母数字序列来说,存储char将浪费三倍于所需的内存。