为什么无法使用格式化打印来打印结构体字段?

Blu*_*rry 6 rust

就像下面的代码一样,当值是原始值或结构(具有派生调试属性)或其他内容时,它确实可以使用格式化打印来打印值。但当值是结构字段时,我无法打印值。

#[derive(Debug)]
struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let a = 3;
    let p = Point { x: 5, y: 10 };

    println!("{}", a); // Working
    println!("{a}"); // Working

    println!("{:?}", p); // Working
    println!("{p:?}"); // Working

    println!("{} {}", p.x, p.y); // Working
    println!("{p.x} {p.y}"); // Not working
}
Run Code Online (Sandbox Code Playgroud)

错误消息如下。

error: invalid format string: expected `'}'`, found `'.'`
  --> src/main.rs:18:17
   |
18 |     println!("{p.x} {p.y}"); // Not working
   |               - ^ expected `}` in format string
   |               |
   |               because of this opening brace
   |
   = note: if you intended to print `{`, you can escape it using `{{`

error: could not compile `rust-ex` due to previous error
Run Code Online (Sandbox Code Playgroud)

我认为 px 和 py 的类型是 i32,因此它们可以使用格式化打印进行打印,但事实并非如此。有什么方法可以使用格式化程序打印来打印结构字段吗?或者有什么需要实施的吗?

Bla*_*ans 8

println!您的问题不是格式问题,只是格式字符串中到底接受什么内容的问题。

与您在其他语言中可能遇到的情况相反,a 中的文字字符串中的大括号之间的部分不是println!字符串转义,这意味着您可以放置​​任何(可打印的)Rust 表达式。相反,您应该将其视为命名参数。因此,它只能是一个变量名。如果您还没有具有该名称的变量,还允许您模仿变量定义,如下所示:println!

println!("{px}", px = p.x);
Run Code Online (Sandbox Code Playgroud)