2013-04-13 100 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'的功能相當簡單。