为什么rust parser需要fn关键字?

时间:2013-04-13 16:28:19

标签: rust

我一直在阅读有关生锈的博客,例如这个封闭让我感到奇怪:

fn each<E>(t: &Tree<E>, f: &fn(&E) -> bool) {
if !f(&t.elem) {
    return;
}

for t.children.each |child| { each(child, f); }
}

为什么不能这样:

each<E>(t: &Tree<E>, f: &(&E) -> bool) {
if !f(&t.elem) {
    return;
}

for t.children.each |child| { each(child, f); }
}

也许我在班级系统上遗漏了一些可以阻止这种情况的事情。

2 个答案:

答案 0 :(得分:24)

它使编译器,语法高亮显示器,shell脚本和人类(即每个人)的解析变得更加复杂。

例如,对于fnfoo采用具有两个int参数的函数并且不返回任何内容,bar获取指向2 {{元组的元组的指针1}}š

int

如果没有fn foo(f: &fn(int, int)) {} fn bar(t: &(int, int)) {} ,两者的参数都变为fn,编译器无法区分它们。当然可以提出其他规则,因此它们的编写方式不同,但这些几乎肯定没有优于使用&(int, int)

答案 1 :(得分:5)

有些fn可能看起来无关紧要,但这有一个附带好处,即使用'grep'非常容易导航锈色代码。要找到函数'foo'的定义,你只需要grep“fn \ sfoo”。要查看源文件中的主要定义,只需grep“(fn | struct | trait | impl | enum | type)”。

这在Rust缺乏IDE的早期阶段非常有用,并且可能在其他方面简化语法。

使语法不如C ++模糊是一个主要目标,它使通用编程更容易(你不必将这么多的定义引入编译单元,按照特定的顺序,正确解析它),并应该使未来工具更容易。与当前C ++ IDE必须处理的许多问题相比,自动插入'fn'的功能非常简单。

相关问题