gpt4 book ai didi

syntax - 为什么在模式匹配中使用 `ref` 而不是星号?

转载 作者:行者123 更新时间:2023-11-29 08:26:05 24 4
gpt4 key购买 nike

我在尝试理解 Rust 中的模式匹配规则时遇到了问题。我最初认为模式背后的想法是像这样匹配左侧和右侧:

struct S {
x: i32,
y: (i32, i32)
}
let S { x: a, y: (b, c) } = S { x: 1, y: (2, 3) };
// `a` matches `1`, `(b, c)` matches `(2, 3)`

但是,当我们想将引用绑定(bind)到右侧的值时,我们需要使用 ref 关键字。

let &(ref a, ref b) = &(3, 4);

这感觉很不一致。

为什么我们不能像这样使用解引用运算符*来匹配左侧和右侧?

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

为什么模式在 Rust 中不是这样工作的?为什么不是这样,还是我完全误解了什么?

最佳答案

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

let bar1 = &42;
let ref bar2 = 42;

请注意,在 let &(ref a, ref b) = &(3, 4) 中,ab 都有输入 &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

另见:

关于syntax - 为什么在模式匹配中使用 `ref` 而不是星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58184472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com