在Rust中,将非引用与引用进行模式匹配有什么作用? [英] What does pattern-matching a non-reference against a reference do in Rust?
本文介绍了在Rust中,将非引用与引用进行模式匹配有什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
对具有不包括引用的模式的引用进行模式匹配时会发生什么情况?
以下是使用结构模式的示例:
fn main() {
struct S(u32);
let S(x) = &S(2);
// type of x is `&u32`
}
我对此行为感到惊讶,因为左侧的模式与右侧的数据似乎不匹配,而不像&
中的&
排列。
看起来是这样的,当RHS是结构引用,而LHS是带有字段模式的结构模式时,字段模式中变量的类型是&F
,其中F
是字段的类型。
我要找的是:
- 解释预期行为的引用
- 对行为的解释,其通用性足以解释除了结构之外,元组和枚举还会发生什么。例如,在
let (x,) = &(2,);
中,x
的类型为i32
(更正:&i32
)。
我在"铁锈参考"或"铁锈书"中找不到任何有关这方面的内容,但我可能遗漏了它。
推荐答案
在Rust1.26中的";Match人机工程学&Quot;中介绍了您遇到的行为,并在its own RFC中进行了说明。简而言之,当根据非引用模式匹配引用时,默认情况下绑定模式切换为使用ref
绑定。
let S(x) = &S(2)
去糖到let &S(ref x) = &S(2)
。ref
的";旧&q;状态在"生锈手册"中很快显示为discussed。
对行为的解释,其一般性足以解释除了结构之外,元组和枚举还会发生什么。例如,在let (x,) = &(2,);
中,x
的类型为i32
。
这是不正确的-如果您向Rust询问x
的类型,它会告诉您它是&i32
,正如人们预期的那样:
let (x,) = &(2i32,);
let () = x;
// ^^ - this expression has type `&i32`
换句话说,适用于结构和枚举的相同绑定模式规则也适用于元组。
这篇关于在Rust中,将非引用与引用进行模式匹配有什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文