Syntax 为什么在模式匹配中使用'ref'而不是星号?
我很难理解Rust中的模式匹配规则。我最初认为模式背后的想法是匹配左侧和右侧,如下所示: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); //
结构{
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
另见:
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
模式的问题。我不认为有一个明确的答案。语法只是决定了它现在的用途。这里您实际上需要指定一个加载值的位置。取消引用将给出存储在该位置的值,而不是该位置本身。至少这是我第一次遇到这个问题时的印象。在这里,您实际上需要指定一个加载值的位置。取消引用将给出存储在该位置的值,而不是该位置本身。至少这是我第一次见到这个人时的印象。