在打印 `format_args!` 时,临时值被借用并被丢弃。

4
(有很多类似标题的问题,但我认为这个问题与它们都不同。)
Rust 版本:1.69.0。
以下内容按预期工作:
fn main() {
    println!("{}", format_args!("hello {}", "world"));
}

但是借用检查器阻止以下代码编译。

fn main() {
    let args = format_args!("hello {}", "world");
    println!("{}", args);
}

错误:

error[E0716]: temporary value dropped while borrowed
 --> src/main.rs:2:16
  |
2 |     let args = format_args!("hello {}", "world");
  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- temporary value is freed at the end of this statement
  |                |
  |                creates a temporary value which is freed while still in use
3 |     println!("{}", args);
  |                    ---- borrow later used here
  |
  = note: this error originates in the macro `format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider using a `let` binding to create a longer lived value
  |
2 ~     let binding = format_args!("hello {}", "world");
3 ~     let args = binding;
  |

据我所知,Rust的借用规则没有任何违规情况——所有内容都在作用域内,绑定到变量上,没有过早释放等。fmt::Arguments<'a>具有生命周期参数,但不清楚它试图保留什么数据正在被丢弃。此外,帮助信息显然是虚假的(args的生命周期与binding一样长!)。


好问题,format_args是编译器内置的,所以很难回答,猜测一下,你不能这样做。 - Stargateur
我不认为这是重复的,因为你在这里询问应该适用的一般规则,而另一个问题是关于如何绕过此限制的。 - Stargateur
我认为已经足够接近了。自己关闭问题,然后由他人重新开启,这真是相当奇怪的事情! - BallpointBen
在SO上提问是一种常见的资源,一旦你发布问题,它就成为了公共资源,请查看SO的许可协议。你只是问题的原始作者。所以,是的,你自己的问题可以重新开放而无需你的同意 :p 重复问题是指回答,而不是问题本身,在其他问题的答案并没有真正回答你的好问题,“为什么这个不编译?”另一个问题是“如何修复我的代码?”,这两个问题非常相关,但并不重复。 - Stargateur
1个回答

4

从@m-ou-se的评论中得知:“format_args的扩展包括需要延长生命周期的临时变量。目前我们没有灵活的方法来做到这一点。” - kmdreko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接