rust - 当用于分隔匹配表达式的分支时,大括号和逗号之间有什么区别?

标签 rust expression

我刚刚开始学习 Rust,有些事情让我感到困惑。

我读了《编程猜谜游戏》这本书的第二章,代码的某些部分让我想知道什么是对的,什么是错的。

示例: 这是我在 another question 中询问的一个循环:

 loop {
    ...

    match guess.cmp(&secret_number) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => {
            println!("You win!");
            break;
        }
    }
}

我意识到我可以这样写:

 match guess.cmp(&secret_number) {
    Ordering::Less => {
        println!("Too low!") // without semicolon ;
    } // without comma ,
    Ordering::Greater => {
        println!("Too high!")
    }
    Ordering::Equal => {
        println!("You win!!!");
        break;
    }
 }

我觉得这很令人困惑,我不知道这是好还是错,是否会导致 future 的重大变化...... 谁能帮我理解一下吗?

最佳答案

如果使用大括号,则匹配臂末尾的逗号是可选的。 rust 解析器/分词器可以明确解析带或不带逗号的匹配臂。 Look here:逗号是可选的。

任何以分号结尾的语句都是不返回任何值的语句(期望 return <>; 语句)。

在第一种情况下,

Ordering::Less => println!("Too small!"),

// Returns a unit value 

在第二种带有大括号的情况下,将返回不带分号的最后一行。在本例中,它是 unit value.

请参阅此示例:

   let flag = false; 

   let result = match flag {
        false => {
            println!("in false arm");
            100
        },
        true => {
            println!("In true arm");
            200
        }
   };
   println!("result = {}", result);

这将打印以下内容:

in false arm
result = 100

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f4a531293d9fc82459da0c3fbcf0e93d

关于rust - 当用于分隔匹配表达式的分支时,大括号和逗号之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62103616/

相关文章:

rust - 从定界文件解析变量

rust - 'Zero Cost Abstraction' 是什么意思?

java - 如何在Eclipse、java中的watch表达式中使用外部类

haskell - 是否可以使用 Template Haskell 获得任何类型的表达式?

spring - bean定义中使用的Spring表达式语言(SpEL)中的条件

colors - 如何更改 rdlc 文本字段的颜色?

rust - 如何在 Ref<HashMap<K, V>> 上调用 get 函数并返回 Option<Ref<T>>?

rust - 如何将动态值传递到 WGPU 顶点着色器?

c# - 如何释放 C# 中从 Rust 返回的字符串的内存?

scala - 类型模式匹配为什么变量是必须的