Max*_*ber 7 pattern-matching rust match-ergonomics
当对引用与不包含引用的模式进行模式匹配时会发生什么?
这是使用结构模式的示例:
fn main() {
struct S(u32);
let S(x) = &S(2);
// type of x is `&u32`
}
Run Code Online (Sandbox Code Playgroud)
这种行为令我感到惊讶,因为左侧的模式似乎与右侧的数据不匹配,这与s 排列的let &S(x) = &S(2)
位置不同。&
看起来发生的情况是,当 RHS 是结构引用并且 lhs 是具有字段模式的结构模式时,字段模式中变量的类型就是&F
whereF
是字段的类型。
我正在寻找的是:
let (x,) = &(2,);
类型x
为i32
(更正:) &i32
。我在《Rust Reference》或《Rust Book》中找不到任何有关此内容的信息,但我可能错过了。
use*_*342 10
您遇到的行为是在 Rust 1.26 中通过“匹配人体工程学”引入的,并在其自己的 RFC中进行了描述。简而言之,当将引用与非引用模式进行匹配时,绑定模式会ref
默认切换为使用绑定。
在你的情况下,let S(x) = &S(2)
脱糖为let &S(ref x) = &S(2)
. Rust 书中ref
很快就讨论了“遗留”状态。
对行为的解释足以解释除结构之外的元组和枚举所发生的情况。例如,在is
let (x,) = &(2,);
类型中。x
i32
这是不正确的——如果你向 Rust 询问 的类型x
,它会告诉你它是&i32
,正如人们所期望的那样:
let (x,) = &(2i32,);
let () = x;
// ^^ - this expression has type `&i32`
Run Code Online (Sandbox Code Playgroud)
换句话说,适用于结构和枚举的相同绑定模式规则也适用于元组。
归档时间: |
|
查看次数: |
822 次 |
最近记录: |