5

我一直在阅读有关 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); }
}

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

4

2 回答 2

24

它使编译器、语法高亮程序、shell 脚本和人类(即每个人)的解析更加复杂。

例如, withfn接受foo一个有两个int参数且不返回任何内容的函数,并bar接受一个指向 2 ints元组的指针

fn foo(f: &fn(int, int)) {}
fn bar(t: &(int, int)) {}

没有fn,两者的参数都变为&(int, int)并且编译器无法区分它们。当然可以提出其他规则,因此它们的编写方式不同,但几乎可以肯定,这些规则与仅使用fn.

于 2013-04-14T04:24:23.063 回答
5

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

这在 rust 缺少 IDE 的早期阶段非常有用,并且可能确实以其他方式简化了语法。

使语法不像 C++ 那样模棱两可是一个主要目标,它使泛型编程更容易(您不必按照特定顺序在编译单元中引入如此多的定义来正确解析它),并且应该使未来的工具更容易。与当前 C++ IDE 必须处理的许多问题相比,自动插入“fn”的功能非常简单。

于 2013-09-25T23:22:05.610 回答