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

Rust 如何在运行时打印函数、变量名、闭包等的文本?,rust,Rust,假设我有一个结构,如下所示: struct Abc { a: i32, b: fn(i32) -> bool } 其中,a只是一个存储值,b是用户提供的闭包,用于检查a上的某些条件。如果条件在某一点上计算为false,我想panic并打印一些有关出错原因的调试信息 例如,如果我将b设置为|x | x

假设我有一个结构,如下所示:

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'
这不是很有帮助。我希望能够打印的内容如下:

panicked at 'assertion failed: (self.b)(self.a)'
panicked at 'Abc condiditon failed: x < 10'
“Abc条件失败:x<10”时惊慌失措

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

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

struct LambdaAndText(fn(i32)->bool,&'static str);
impl LambdaAndText{
fn调用(&self,arg:i32){
断言!((self.0)(arg),“Abc条件失败:{}”,self.1);
}
}
宏规则!lambda_和_文本{
(|$p:pat |$e:expr)=>{
LambdaAndText(|$p |$e,stringify!($e))
};
}
fn main(){
设l=lambda_和_text!(|x | x<10);
l、 电话(5);
l、 电话(42);
}

.

实际上,当闭包已经存储在变量中时,有没有办法做到这一点?例如,设l=|x | x<10;设s=lambda_和_文本!(l) )?这将使我的代码更加整洁,但对于解决底层问题来说并不是绝对必要的。不,这依赖于
stringify宏,无法从变量中获取字符串。它只给出一个字符串,其中包含传递给它的任何内容。