如果让表达式使用赋值运算符而不是等于运算符,为什么还要Rust?

ECO*_*ECO 1 rust

我试图把我的头缠在if let表达式周围,我发现它太违反直觉了。我知道它的作用,但是我无法找到一些细节背后的理由。

第一个细节是赋值运算符的使用而不是比较,第二个细节是操作数的放置。

例如:

    let a = Some(5);

    if let Some(i) = a {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

在我看来,这种方式更“清晰”:

    if let Some(i) == a {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

甚至更好:


    if let a == Some(i) {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解背后的原因吗?

Ray*_*oal 7

Rust的语法是

let Some(i) = a
Run Code Online (Sandbox Code Playgroud)

因为我们正在创建一个新变量 i,并使用中的包装值对其进行初始化a。运算符=用于创建新变量。您的左侧有一个模式,右侧有一个表达式。模式中左侧的所有变量均根据右侧表达式中的相应值进行初始化。

比较运算符==在这里没有意义。要说

let Some(i) == a
Run Code Online (Sandbox Code Playgroud)

似乎将返回表达式

let Some(i)
Run Code Online (Sandbox Code Playgroud)

等于表达式

a
Run Code Online (Sandbox Code Playgroud)

在使用时,==您希望左右两侧是已经有值的完整表达式,然后返回它们是否相等。但这不是我们在if-let中所做的。当我们使用if-let时,我们正在创建一个新变量。==仅当可以评估其两侧的表达式时才有意义。

同样,表达式

let a == Some(i)
Run Code Online (Sandbox Code Playgroud)

很奇怪,因为a已经存在。我们当然不是在创建新变量a。反对使用==与以前相同的论点,因为i还不存在。

总而言之,我们=在创建新变量和==测试表达式的相等性时使用(如果表达式中包含变量,则此类变量必须已经存在)。