相关疑难解决方法(0)

有没有办法将随机数生成器存储为特征对象?

有没有办法在 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)

traits rust trait-objects

3
推荐指数
1
解决办法
1479
查看次数

如何迭代调用 Sha256::digest,将前一个结果传递给每个后续调用?

我正在尝试实现迭代 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)

我想要第二种风格,这样我就可以轻松地重复两次以上。

rust

3
推荐指数
1
解决办法
80
查看次数

需要参考时有条件克隆

我有一个结构参考。

我需要引用一个结构。有时是相同的,但有时是克隆然后修改的。

现在,我知道

if condition {
    let mut copy = original.clone();
    copy.select();
    do_big_thing(&copy);
} 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();
    &copy
} else {
    original
};
do_big_thing(reference);
Run Code Online (Sandbox Code Playgroud)

由于此问题是关于寻找一种更简洁,更整洁的方式写同一件事(使用原始引用或克隆),因此我无法接受会在运行时增加开销或其他开销的解决方案unsafe

操场

rust

2
推荐指数
1
解决办法
85
查看次数

如何将不同的类实例分配给 Rust 中的变量?

我正在尝试用 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)

rust

1
推荐指数
1
解决办法
378
查看次数

标签 统计

rust ×4

trait-objects ×1

traits ×1