在Rust中"(1..4)"和"{1..4}"迭代之间是否有任何不同的语义?

Nan*_*iao 9 rust

我找到了使用 (1..4)

fn main() {
    for v in (1..4) {
        println!("{}", v);
    }
}
Run Code Online (Sandbox Code Playgroud)

{1..4}

fn main() {
    for v in {1..4} {
        println!("{}", v);
    }
}
Run Code Online (Sandbox Code Playgroud)

获得相同的结果." (1..4)"和" {1..4}"迭代之间是否有任何不同的语义?

Mas*_*ara 10

它们生成相同的迭代器.你甚至可以省略括号/括号:

fn main() {
    for v in 1..4 {
        println!("{}", v);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用()或包含表达式{}.但是有一点不同:{}创建一个块,你可以在其中编写语句(如let).解析表达式的方式也有非常细微的差别.编辑:我发现了一篇博客文章,描述了强制和借助如何工作的另一个区别.

()如果您不需要陈述,通常是首选.


She*_*ter 6

没有真正有用的区别.括号和大括号都算作单个表达式和函数来改变优先级.我很确定它们的解析规则略有不同,但在那一点上我猜有更清晰的编写代码的方法.

请注意,在您的示例中,惯用的方法是既不使用:

fn main() {
    for v in 1..4 {
        println!("{}", v);
    }
}
Run Code Online (Sandbox Code Playgroud)

在需要的时候,我觉得我只见过括号,从不括号:

fn main() {
    println!("{}", (1..4).count());
}
Run Code Online (Sandbox Code Playgroud)

极少数情况下,花括号可提供更多动力.由于它们用于启动新范围,因此您可以使用它们在某些棘手的位置"手动"转移所有权.出于所描述的简单迭代器的目的,不会有任何明显的差异.