2013-04-13 55 views
4

我一直在阅读有关的防锈和这个封闭例如博客让我纳闷:为什么防火墙解析器需要fn关键字?

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); } 
} 

也许我缺少的东西类系统会阻止这一点。

回答

24

它使编译器,语法荧光笔,shell脚本和人(即所有人)的解析更加复杂。

例如,fnfoo需要有两个int参数,并没有返回功能,并bar需要一个指针的2 int小号

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

元组没有fn的论据都成为&(int, int)和编译器无法区分它们。当然,可以拿出其他规则,以便它们的写法不同,但这几乎肯定比仅使用fn没有任何优势。

5

某些fn可能看起来无关紧要,但这有一个副作用,即防火代码非常易于使用'grep'导航。要找到函数'foo'的定义,只需grep“fn \ sfoo”。要查看源文件中的主要定义,只需grep为“(fn | struct | trait | impl | enum | type)”。

在这个早期阶段,当生锈缺乏IDE时,这非常有用,并且可能会以其他方式简化语法。

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