【问题标题】:Why can't print a struct field with formatted print?为什么不能用格式化打印打印结构字段?
【发布时间】:2023-01-10 12:50:30
【问题描述】:

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

#[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
}

错误信息如下。

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

我认为 p.x 和 p.y 的类型是 i32 所以它们可以用格式化打印打印,但事实并非如此。 有没有办法用格式化程序打印打印结构字段?或者有什么需要执行的吗?

【问题讨论】:

标签: rust


【解决方案1】:

您的问题不是格式问题,只是 println! 在其格式字符串中接受的内容的问题。

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

println!("{px}", px = p.x);

【讨论】:

    【解决方案2】:

    另一个类似但不同的问题是当你有一个 Rust 变量时尝试 println!下划线:

    let _ = 2;
    println!("Value of _ is {_}");
    

    错误是: 格式字符串无效:参数名称无效_ ... println!("_ 的值为 {_}"); ^ 格式字符串中的参数名称无效

    这可能是因为下划线是meant to be ignored

    下划线 (_) 是 Rust 中的保留标识符,根据上下文有不同的用途。它通常意味着某些东西被忽略了。

    其他网站解释了在生锈中,下划线是如何做到的"not bind to the variable";或"does not have ownership of the object"

    我知道 OP 已经找到了最佳答案。我只是想提供这个答案,以防其他人搜索“无效格式字符串”或“无效参数名称_”并找到这个 SO 问题。

    如果您尝试了以下解决方法:

     println!("Value of _ is {}", _);
    

    然后你得到一个新的错误,加强了这个想法下划线变量永远不会被使用:

    in expressions, `_` can only be used on the left-hand side of an assignment 
    `_` not allowed here
    

    所以在我上面的代码中允许在赋值的左侧使用下划线变量,或者这个下划线表达式,其中_ signifies a placeholder in a destructuring assignment但是您以后不能引用下划线变量,包括println!。唯一的解决办法是使用不同的变量名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2017-11-24
      • 2013-09-23
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多