gpt4 book ai didi

rust - 有什么方法可以为 rust 结构附加一些调试字段吗?

转载 作者:行者123 更新时间:2023-12-05 04:26:38 24 4
gpt4 key购买 nike

例如,我希望 struct S 仅在测试时有一个 name_count 字段,因此我可以操作 last_name 来验证有关的一些属性name_count 在测试中。

pub struct S {
last_name: String,
#[cfg(test)] {
// This field only exists in tests
name_count: HashMap<String, i32>,
}
}

impl S {
fn record_last_name(&mut self, name: String) {
self.last_name = name;
if cfg!(test) {
// Increase self.name_count[self.last_name]
}
}
}

#[test]
fn test_last_name_count() {
let mut s = S {};
...
// assert some properties about name_count
}

但是,这段代码无法编译,Rust 似乎不支持 #[cfg(test)] 内部结构定义,所以我想知道我该怎么做。

最佳答案

你可以这样做,但是 #[cfg(test)] 是一个属性宏,所以它适用于它后面的任何内容,并且不需要像你写的那样的 block 作用域。

您还需要将 #[cfg(...)] 属性添加到函数和方法中,以确保不会出现“缺少字段”/“没有名为 ... 的字段”编译器错误。

use std::collections::HashMap;

pub struct S {
last_name: String,
#[cfg(test)]
// This field only exists in tests
name_count: HashMap<String, i32>,
}

impl S {
#[cfg(test)]
fn record_last_name(&mut self, name: String) {
self.last_name = name;
// Increase self.name_count[self.last_name]
}
}

#[cfg(not(test))]
fn main() {
let mut s = S { last_name: "Foo".to_string() };
}

#[test]
fn test_last_name_count() {
let mut s = S { last_name: "Foo".to_string(), name_count: HashMap::new() };
// assert some properties about name_count
}

关于rust - 有什么方法可以为 rust 结构附加一些调试字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73024108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com