【发布时间】:2019-05-25 11:18:43
【问题描述】:
我正在尝试构建自己的自定义 LogRecord 并将其传递到 log crate。
use log::RecordBuilder;
fn main() {
let msg = format_args!("Completed: {}, Elapsed={:?}", "blah", 20);
//let msg = format_args!("This is OK");
let mut builder = RecordBuilder::new();
let _log_rec = builder
.args(msg)
.build();
}
我在调用args 方法时遇到了临时生命周期问题。错误是
--> src/main.rs:4:28
|
4 | let msg = format_args!("Completed: {}, Elapsed={:?}", "blah", 20);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
...
8 | .args(msg)
| --- borrow later used here
|
= note: consider using a `let` binding to create a longer lived value
通常这很容易解决 - 只需将临时变量放入局部变量即可。不过在这种情况下,我不明白如何解决它,因为我已经将我能想到的所有东西都放入了局部变量中(这就是为什么我不认为这个问题与其他问题重复)。这似乎是 format_args! 宏所特有的。
有趣的是,如果您在对 format_args!() 的调用中不使用任何 {} 占位符,问题就会消失。
实际解决方案
The solution from E_net4 is correct。它在我的实际代码中没有立即起作用,即:
impl Drop for ExecutionTimer2 {
fn drop(&mut self) {
let elapsed = self.start_time.elapsed();
let mut builder = RecordBuilder::new();
let log_rec = builder
.level(Level::Debug)
.target("ExecutionTimer")
.file(Some(self.file))
.module_path(Some(self.module_path))
.line(Some(self.line))
.args(format_args!("Completed: {}, Elapsed={:?}", self.name, elapsed))
.build();
let logger = log::logger();
logger.log(&log_rec);
}
}
但我再次应用了“内联”技术来编写这段代码,它确实可以编译:
impl Drop for ExecutionTimer2 {
fn drop(&mut self) {
let elapsed = self.start_time.elapsed();
let mut builder = RecordBuilder::new();
let logger = log::logger();
logger.log(&
builder
.level(Level::Debug)
.target("ExecutionTimer")
.file(Some(self.file))
.module_path(Some(self.module_path))
.line(Some(self.line))
.args(format_args!("Completed: {}, Elapsed={:?}", self.name, elapsed))
.build()
);
}
}
【问题讨论】:
标签: rust