有没有办法在 Rust 中保存通用随机数生成器?我想要一种编写通用代码的方法,例如:
use rand::Rng; // 0.7.2
fn main() {
// Purely random numbers on the interval 0 to 1
println!("Pure random");
let mut rng: Box<dyn rand::Rng> = Box::new(rand::thread_rng());
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
// On a seed
*rng = rand::SeedableRng::seed_from_u64(0);
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
}
Run Code Online (Sandbox Code Playgroud)
该变量rng使用种子或其他方式保存不同类型的随机数生成器。然而,这段代码存在很多错误,例如:
use rand::Rng; // 0.7.2
fn main() {
// Purely random numbers on the interval 0 to 1
println!("Pure random");
let mut rng: …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现迭代 SHA256。这有效:
use sha2::{Digest, Sha256}; // 0.8.2
fn main() {
let preimage = [42; 80];
let hash = Sha256::digest(&Sha256::digest(&preimage));
}
Run Code Online (Sandbox Code Playgroud)
这不会:
use sha2::{Digest, Sha256}; // 0.8.2
fn main() {
let preimage = [42; 80];
let mut hash = preimage;
for _ in 0..2 {
hash = Sha256::digest(&hash);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
use sha2::{Digest, Sha256}; // 0.8.2
fn main() {
let preimage = [42; 80];
let hash = Sha256::digest(&Sha256::digest(&preimage));
}
Run Code Online (Sandbox Code Playgroud)
我想要第二种风格,这样我就可以轻松地重复两次以上。
我有一个结构参考。
我需要引用一个结构。有时是相同的,但有时是克隆然后修改的。
现在,我知道
if condition {
let mut copy = original.clone();
copy.select();
do_big_thing(©);
} else {
do_big_thing(original);
}
Run Code Online (Sandbox Code Playgroud)
但是do_big_thing有其他论点,我不想重复这一行。
有没有办法
do_big_thing(它的寿命不必更长)?
当然,这是行不通的,因为copy寿命不长:
let mut reference = if condition {
let mut copy = original.clone();
copy.select();
©
} else {
original
};
do_big_thing(reference);
Run Code Online (Sandbox Code Playgroud)
由于此问题是关于寻找一种更简洁,更整洁的方式写同一件事(使用原始引用或克隆),因此我无法接受会在运行时增加开销或其他开销的解决方案unsafe。
我正在尝试用 Rust 创建一个简单的程序(用于教育目的)。目前,我主要使用经典的 OOP 语言(如 Java)进行开发,因此我意识到我可能无法在 Rust 中实现相同的功能。
我试图通过根据外部(用户触发)输入初始化变量,然后在此对象实例上调用方法来避免重复代码。
我搜索了一段时间寻找答案,但我无法为我的问题得到明确的答案。
为了说明我的问题,我用 Java 写了以下几行:
interface Command {
String getName();
}
class FirstCommand implements Command {
@Override
public String getName() {
return "First command";
}
}
class SecondCommand implements Command {
@Override
public String getName() {
return "Second command";
}
}
public class Test {
public static void main(String[] argv) {
Command cmd;
if (argv.length > 10) {
cmd = new SecondCommand();
} else {
cmd = new FirstCommand();
}
System.out.println(cmd.getName());
} …Run Code Online (Sandbox Code Playgroud)