小编Dmi*_*rov的帖子

如何初始化集成测试的记录器?

我有一个包含src目录中的生产代码和目录中的集成测试的箱子tests.生产代码使用log宏.

我想在运行集成测试时初始化一个全局记录器(例如env_logger::init().unwrap();)有几个测试并且测试顺序没有定义,所以我不知道我应该在哪个测试中放置initialize命令.

有什么方法可以做得很好吗?也许通过覆盖测试main功能?

rust

16
推荐指数
5
解决办法
2072
查看次数

如何将 Rc<RefCell<Box<MyStruct>>> 传递给接受 Rc<RefCell<Box<dyn MyTrait>>> 的函数?

我最初在这里问过这个问题,但它被标记为重复,尽管在我看来它只重复了其中的一部分,所以我创建了一个更具体的问题:

考虑以下代码:

use std::rc::Rc;

trait MyTrait {
    fn trait_func(&self);
}

struct MyStruct1;

impl MyStruct1 {
    fn my_fn(&self) {
        // do something
    }
}

impl MyTrait for MyStruct1 {
    fn trait_func(&self) {
        // do something
    }
}

fn my_trait_fn(t: Rc<dyn MyTrait>) {
    t.trait_func();
}

fn main() {
    let my_str: Rc<MyStruct1> = Rc::new(MyStruct1);
    my_trait_fn(my_str.clone());
    my_str.my_fn();
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常。现在我想更改 的定义trait_func以接受 a &mut self,但它不会像Rc仅适用于不可变数据那样工作。我使用的解决方案是包装MyTraitRefCell

use std::cell::RefCell;

fn my_trait_fn(t: Rc<RefCell<Box<dyn MyTrait>>>) {
    t.borrow_mut().trait_func();
}

fn …
Run Code Online (Sandbox Code Playgroud)

smart-pointers rust trait-objects

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

Rust 是否优化按值传递临时结构?

假设我有一个 Rust 结构向量。结构相当大。当我想插入一个新的时,我编写这样的代码:

my_vec.push(MyStruct {field1: value1, field2: value2, ... });
Run Code Online (Sandbox Code Playgroud)

推送的定义是

fn push(&mut self, value: T)
Run Code Online (Sandbox Code Playgroud)

这意味着值是按值传递的。我想知道 Rust 是否先创建一个临时对象,然后复制到推送函数,或者它是否优化代码,以便不创建和复制临时对象?

rust

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

当有条件地从二进制堆中弹出元素时,借用检查器不高兴

我正在尝试编写一个简单的函数,它会从BinaryHeap中弹出满足某个条件的元素.该函数如下所示:

fn check_the_queue(mut queue: BinaryHeap<i32>) {
while !queue.is_empty() {
    let entry = queue.peek().unwrap();
    if *entry <= 0 {
        queue.pop();
    } 
}
Run Code Online (Sandbox Code Playgroud)

编译借阅检查程序时开始抱怨:

src/main.rs:52:13: 52:18 error: cannot borrow `queue` as mutable because it is also borrowed as immutable
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题并使借阅检查员满意?

rust

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

标签 统计

rust ×4

smart-pointers ×1

trait-objects ×1