为什么打印!函数在Rust中使用感叹号?

Ché*_*éyo 37 rust

在Swift中,!意味着展开可选(可能的值).

She*_*ter 49

println!不是一个功能,它是一个.宏用于!区分它们与普通方法调用.该文档包含更多信息.


Rust使用该Option类型来表示可选数据.它有一种unwrap方法.

Rust 1.13将问号运算符添加?try!宏的模拟(最初通过RFC 243提出).

问号运算符的一个很好的解释是在Rust编程语言中.

fn foo() -> Result<i32, Error> {
    Ok(4)
}

fn bar() -> Result<i32, Error> {
    let a = foo()?;
    Ok(a + 4)
}
Run Code Online (Sandbox Code Playgroud)

问号运算符也扩展到Option,因此您可能会看到它用于展开值或None从函数返回.这不仅仅是展开,因为程序不会恐慌:

fn foo() -> Option<i32> {
    None
}

fn bar() -> Option<i32> {
    let a = foo()?;
    Some(a + 4)
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*nen 31

println!是 rust 中的宏,这意味着 rust 会在编译时为您重写代码。

例如这个:

fn main() {
    let x = 5;
    println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)

将在编译时转换为类似这样的内容:

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std;
fn main() {
    let x = 5;
    {
        ::std::io::_print(::core::fmt::Arguments::new_v1(
            &["", "\n"],
            &match (&x,) {
                (arg0,) => [::core::fmt::ArgumentV1::new(
                    arg0,
                    ::core::fmt::Display::fmt,
                )],
            },
        ));
    };
}
Run Code Online (Sandbox Code Playgroud)

*请注意, 是&x作为参考传递的。

它是一个宏,因为它可以完成函数无法完成的事情:

  • 它在编译时解析格式字符串,并生成类型安全代码
  • 它有可变数量的参数
  • 它具有命名参数(“关键字参数”)
    println!("My name is {first} {last}", first = "John", last = "Smith");
    
    Run Code Online (Sandbox Code Playgroud)

来源: