【发布时间】:2015-06-19 02:54:42
【问题描述】:
在 Swift 中,! 表示打开一个可选的(可能的值)。
【问题讨论】:
标签: rust
在 Swift 中,! 表示打开一个可选的(可能的值)。
【问题讨论】:
标签: rust
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)
}
【讨论】:
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,
)],
},
));
};
}
*注意&x 作为引用传递。
它是一个宏,因为它做了函数不能做的事情:
println!("My name is {first} {last}", first = "John", last = "Smith");
来源:
【讨论】: