Types 如何将元组分解为类型化变量?

Types 如何将元组分解为类型化变量?,types,rust,tuples,pattern-matching,Types,Rust,Tuples,Pattern Matching,我试图将元组分解为变量,然后错误地提到其中一种类型,从而导致错误: fn main() { let tup = (500, 6.4, 1); let (x: bool, y: f32, z: i16) = tup; println!("{}, {}, {}", x, y, z); } 我的想法是编译器将引发错误,因为x被指定为bool,但与500匹配。令人惊讶的是,这是编译器抱怨的最后一句话,说在这个范围内找不到x、y和z: 我试过另一种方法: fn

我试图将元组分解为变量,然后错误地提到其中一种类型,从而导致错误:

fn main() {
    let tup = (500, 6.4, 1);
    let (x: bool, y: f32, z: i16) = tup;
    println!("{}, {}, {}", x, y, z);
}
我的想法是编译器将引发错误,因为
x
被指定为
bool
,但与
500
匹配。令人惊讶的是,这是编译器抱怨的最后一句话,说在这个范围内找不到x、y和z:

我试过另一种方法:

fn main() {
    let tup = (500, 6.4, 1);
    let mut x: bool = true;
    let mut y: f32 = true;
    let mut z: i16 = true;
    (x, y, z) = tup;
    println!("{}, {}, {}", x, y, z);
}

这一次,编译器确实提出了预期的错误,但它也表示
(x,y,z)=tup的左侧无效。有人能解释一下发生了什么吗?

在执行元组赋值时,应首先指定所有变量,然后指定所有类型:

let (x, y, z): (bool, f32, i16) = tup;

给出您预期的错误()

您需要更仔细地阅读错误;第一个案例的第一个案例是:

错误:应为`)、或`@`中的一个,但找到了`:`
-->src/main.rs:3:11
|
3 |设(x:bool,y:f32,z:i16)=tup;
|^此处应为“)”、“、”或“@”之一
这表明在对元组进行模式匹配时,不能在变量名旁边提供类型。这是一个解析错误,该错误导致整行无效,并导致
x
y
z
无法找到用于
println!()

错误[E0425]:在此范围内找不到值'x'
-->src/main.rs:4:28
|
4 | println!(“{},{},{}”,x,y,z);
|^在此范围内找不到
错误[E0425]:在此范围内找不到值'y'
-->src/main.rs:4:31
|
4 | println!(“{},{},{}”,x,y,z);
|^在此范围内找不到
错误[E0425]:在此范围内找不到值'z'
-->src/main.rs:4:34
|
4 | println!(“{},{},{}”,x,y,z);
|^在此范围内找不到

至于第二种情况,有一堆无效的赋值
y
z
是数字,但您尝试将
bool
s分配给它们
(x,y,z)=……
也是一个无效的赋值-除非它在
let
绑定中,否则它不会匹配模式。

关于“令人惊讶的是,这是编译器抱怨的最后一个语句”:这不是我的经验(来自尝试。有多个错误,第一个是关于它前面的行。对于最后一个错误,您需要使用
let
。但是,如果您试图将
500
分配给
bool
,您的目标是什么?您是想产生错误,还是在寻找某种形式的隐式转换?@Evert请参阅。(x,y,z)=tup;
是编译器抱怨的唯一一行。@Evert试图产生错误。:)感谢您的精彩解释!因此,似乎我无法使用tuple destructuring而不使用
let
,这意味着不隐藏现有变量?不一定;您也可以使用文本执行赋值(例如
let(a,b,c)=(1,2.0,true);
)或通过引入新变量,例如
let(d,e,f)=(a,b,c);
.ljedrz(不知何故,我不会让我标记你)-我在问我是否可以使用现有变量而不隐藏它们。@dotsrash这是我答案下的注释,所以我不需要标记;
let(d,e,f)=(a,b,c)
不会对
a
b
c
进行阴影处理,如果它们实现了
Copy
,它们甚至不会被移动(之后仍然可以使用)。嗯,实际上我想要
(a,b,c)
位于左侧,并且事先声明了
a
b
c
。我想这是不可能的…?我想这会导致我在默认情况下回答“转换为”这种类型(就像您可以使用
.collect()
)我想尝试一下它是否有效,但没有!我现在将把它们转换为:)干杯,知道这确实是可能的非常有用,即使只是为了正确!