【问题标题】:Why does the println! function use an exclamation mark in Rust?为什么 println!函数在 Rust 中使用感叹号?
【发布时间】:2015-06-19 02:54:42
【问题描述】:

在 Swift 中,! 表示打开一个可选的(可能的值)。

【问题讨论】:

    标签: rust


    【解决方案1】:

    println! 不是函数,它是一个。宏使用! 将它们与普通方法调用区分开来。 The documentation 包含更多信息。

    另见:


    Rust 使用Option 类型来表示可选数据。它有一个unwrap 方法。

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

    The Rust Programming Language 中对问号运算符进行了很好的解释。

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

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

    fn foo() -> Option<i32> {
        None
    }
    
    fn bar() -> Option<i32> {
        let a = foo()?;
        Some(a + 4)
    }
    

    【讨论】:

      【解决方案2】:

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

      例如:

      fn main() {
          let x = 5;
          println!("{}", x);
      }
      

      会在编译时转换成这样的:

      #![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,
                      )],
                  },
              ));
          };
      }
      

      *注意&amp;x 作为引用传递。

      它是一个宏,因为它做了函数不能做的事情:

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

      来源:

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 2010-10-11
        • 2011-04-14
        相关资源
        最近更新 更多