gpt4 book ai didi

rust - 如何在运行时打印函数,变量名,闭包等的文本?

转载 作者:行者123 更新时间:2023-12-03 11:28:21 26 4
gpt4 key购买 nike

假设我有一个结构如下:

struct Abc {
a: i32,
b: fn(i32) -> bool
}

其中 a只是存储的值,而 b是用户提供的闭包,用于检查 a的某些条件。如果条件在某些时候评估为false,我想 panic!并打印一些有关出了什么问题的调试信息。

例如,如果我将 b设置为 |x| x < 10,则可以很容易地根据 b(a)的结果进行断言,但是如果断言失败,则输出如下所示:
panicked at 'assertion failed: (self.b)(self.a)'

这不是很有帮助。我希望能够打印的内容如下:
panicked at 'Abc condiditon failed: x < 10'

基本上,是否有某种方法可以获取某些代码的“文本”以用于调试消息?以字符串的形式获取就足够了,我不需要任何容易解析的东西。我怀疑如果可能的话,这将涉及一些宏观的骗术,但我不知道从哪里开始。

最佳答案

尽管原始代码通常不会保存在Rust的二进制文件中,但是您确实可以使用宏来构建它:

struct LambdaAndText(fn(i32) -> bool, &'static str);

impl LambdaAndText {
fn call(&self, arg: i32) {
assert!((self.0)(arg), "Abc condiditon failed: {}", self.1);
}
}

macro_rules! lambda_and_text {
(|$p:pat| $e:expr) => {
LambdaAndText(|$p| $e, stringify!($e))
};
}

fn main() {
let l = lambda_and_text!(|x| x < 10);

l.call(5);
l.call(42);
}

This prints thread 'main' panicked at 'Abc condiditon failed: x < 10', src/main.rs:5:9 as expected

关于rust - 如何在运行时打印函数,变量名,闭包等的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59102596/

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