我有一个包含src目录中的生产代码和目录中的集成测试的箱子tests.生产代码使用log宏.
我想在运行集成测试时初始化一个全局记录器(例如env_logger::init().unwrap();)有几个测试并且测试顺序没有定义,所以我不知道我应该在哪个测试中放置initialize命令.
有什么方法可以做得很好吗?也许通过覆盖测试main功能?
我最初在这里问过这个问题,但它被标记为重复,尽管在我看来它只重复了其中的一部分,所以我创建了一个更具体的问题:
考虑以下代码:
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仅适用于不可变数据那样工作。我使用的解决方案是包装MyTrait成RefCell:
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) 假设我有一个 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 是否先创建一个临时对象,然后复制到推送函数,或者它是否优化代码,以便不创建和复制临时对象?
我正在尝试编写一个简单的函数,它会从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)
我怎样才能解决这个问题并使借阅检查员满意?