Syntax 为什么在模式匹配中使用'ref'而不是星号?

Syntax 为什么在模式匹配中使用'ref'而不是星号?,syntax,rust,pattern-matching,Syntax,Rust,Pattern Matching,我很难理解Rust中的模式匹配规则。我最初认为模式背后的想法是匹配左侧和右侧,如下所示: 结构{ x:i32, y:(i32,i32) } 设S{x:a,y:(b,c)}=S{x:1,y:(2,3)}; //'a'匹配'1',`(b,c)`matches`(2,3)` 但是,当我们想要将引用绑定到右侧的值时,我们需要使用ref关键字 let&(参考a,参考b)=&(3,4); 这感觉相当不一致 为什么我们不能使用解引用操作符*像这样匹配左侧和右侧 let&(*a,*b)=&(3,4); //

我很难理解Rust中的模式匹配规则。我最初认为模式背后的想法是匹配左侧和右侧,如下所示:

结构{
x:i32,
y:(i32,i32)
}
设S{x:a,y:(b,c)}=S{x:1,y:(2,3)};
//'a'匹配'1',`(b,c)`matches`(2,3)`
但是,当我们想要将引用绑定到右侧的值时,我们需要使用
ref
关键字

let&(参考a,参考b)=&(3,4);
这感觉相当不一致

为什么我们不能使用解引用操作符
*
像这样匹配左侧和右侧

let&(*a,*b)=&(3,4);
//`a`匹配`3`,`b`匹配`4``

为什么这不是锈迹中图案的工作方式?是不是有什么原因导致情况并非如此,还是我完全误解了什么?

在这种情况下,使用de引用运算符会非常混乱
ref
有效地引用了该值。这些或多或少是等效的:

let bar1 = &42;
let ref bar2 = 42;
请注意,在
中,让&(ref a,ref b)=&(3,4)
a
b
都具有类型
&i32
-它们是引用。还要注意的是,由于符合人体工程学,
let(a,b)=&(3,4)
是相同和更短的

此外,类型使用了符号和(
&
)和星号(
*
)。正如您所提到的,模式匹配希望将值与模式“对齐”。符号已用于匹配和删除模式中的一层引用:

let foo: &i32 = &42;

match foo {
    &v => println!("{}", v),
}
通过类比,将来可能会支持原始指针使用此语法的某些变体

let foo: *const i32 = std::ptr::null();

match foo {
    *v => println!("{}", v),
}
由于符号和星号都可用于删除一层引用/指针,因此它们不能用于添加一层。因此需要一些新的关键字,并选择了
ref

另见:


在这种情况下,使用de引用运算符将非常混乱
ref
有效地引用了该值。这些或多或少是等效的:

let bar1 = &42;
let ref bar2 = 42;
请注意,在
中,让&(ref a,ref b)=&(3,4)
a
b
都具有类型
&i32
-它们是引用。还要注意的是,由于符合人体工程学,
let(a,b)=&(3,4)
是相同和更短的

此外,类型使用了符号和(
&
)和星号(
*
)。正如您所提到的,模式匹配希望将值与模式“对齐”。符号已用于匹配和删除模式中的一层引用:

let foo: &i32 = &42;

match foo {
    &v => println!("{}", v),
}
通过类比,将来可能会支持原始指针使用此语法的某些变体

let foo: *const i32 = std::ptr::null();

match foo {
    *v => println!("{}", v),
}
由于符号和星号都可用于删除一层引用/指针,因此它们不能用于添加一层。因此需要一些新的关键字,并选择了
ref

另见:


在这种特定情况下,您可以使用
ref
或星号实现相同的功能:

fn main(){
设(a,b)=&(3,4);
显示类型名称(a);
显示类型名称(b);
}
fn显示类型名称(uu:T){
println!(“{}”,std::any::type_name::());//rust 1.38.0及以上版本
}
它将
a
b
显示为
&i32
类型。这一人体工程学特征被称为


但它仍然没有回答为什么首先要使用
ref
模式的问题。我不认为有一个明确的答案。语法只取决于它现在所涉及的内容。

在这种特定情况下,您可以使用
ref
或星号实现相同的功能:

fn main(){
设(a,b)=&(3,4);
显示类型名称(a);
显示类型名称(b);
}
fn显示类型名称(uu:T){
println!(“{}”,std::any::type_name::());//rust 1.38.0及以上版本
}
它将
a
b
显示为
&i32
类型。这一人体工程学特征被称为


但它仍然没有回答为什么首先要使用
ref
模式的问题。我不认为有一个明确的答案。语法只是决定了它现在的用途。

这里您实际上需要指定一个加载值的位置。取消引用将给出存储在该位置的值,而不是该位置本身。至少这是我第一次遇到这个问题时的印象。在这里,您实际上需要指定一个加载值的位置。取消引用将给出存储在该位置的值,而不是该位置本身。至少这是我第一次见到这个人时的印象。