Rust 中的 | (竖线) 符号

Rust 中的 | 用途比较多,这里做一个简单的整理。

模式匹配中的“或”模式 (Pattern Alternatives)

在模式匹配(如 match 语句或 if let 表达式)中, | 可以用来表示多个模式的组合:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
    let pressed_key = read_key()?;

    if let Key::Ctrl('q') | Key::Ctrl('x') = pressed_key {
        self.should_quit = true;
    }

    // 和下面这句等价:
    match pressed_key {
        Key::Ctrl('q') | Key::Ctrl('x') => self.should_quit = true,
        _ => (),
    }

    // ...

    Ok(())
}

闭包参数

在 Rust 的闭包中, 我们在两个 | 之间定义闭包的参数:

1
2
let add_one = |x| x + 1;
let result = add_one(5);

参数可以有多个,也可以留空。

严格意义来说,在闭包中的用法不是操作符,应该算是 Rust 语法的一部分。

位或 (Bitwise OR) 操作

这个比较简单,和其他语言中一致:

1
2
3
let a = 0b1010;
let b = 0b1100;
let c = a | b;

逻辑或 || 操作符

这个也跟其他语言一样,用于连接两个布尔表达式:

1
2
3
4
5
6
7
8
let a = true;
let b = false;

if a || b {
    println!("至少一个条件为真");
} else {
    println!("两个条件都为假");
}

类型约束中的“或”约束

在使用泛型和 trait 时, | 可以用于指定类型必须实现多个 trait 中的任意一个(目前这个用法还在实验阶段,需要在 Cargo.toml 中启用特定的特性):

1
2
3
fn do_something<T: Display | Debug>(value: T) {
    // ...
}

在这个例子中, T 类型参数必须实现 DisplayDebug trait 中的至少一个。

updatedupdated2023-12-192023-12-19