Keyword ref

source ·
Expand description

在模式匹配期间通过引用绑定。

ref 注解模式绑定,使它们借用值而不是移动。 就匹配而言,它不是模式的一部分:它不影响值是否匹配,只影响其匹配方式。

默认情况下,match 语句会消耗掉它们所能消耗的一切,当您并不真正需要移动和拥有该值时,这有时会成为一个问题:

let maybe_name = Some(String::from("Alice"));
// 这里消耗了变量 'maybe_name' ...
match maybe_name {
    Some(n) => println!("Hello, {n}"),
    _ => println!("Hello, world"),
}
// ... 现在不可用。
println!("Hello again, {}", maybe_name.unwrap_or("world".into()));
Run

使用 ref 关键字,该值只能被借用,而不能被移动,从而使它可在 match 语句之后使用:

let maybe_name = Some(String::from("Alice"));
// 使用 `ref`,值是借用的,而不是移动的 ...
match maybe_name {
    Some(ref n) => println!("Hello, {n}"),
    _ => println!("Hello, world"),
}
// ... 所以可以在这里!
println!("Hello again, {}", maybe_name.unwrap_or("world".into()));
Run

&ref

  • & 表示您的模式期望引用一个对象。 因此,& 是所述模式的一部分: &FooFoo 匹配不同的对象。

  • ref 表示您想要引用一个未包装的值。它不匹配: Foo(ref foo)Foo(foo) 匹配相同的对象。

有关更多信息,请参见 Reference