2017-02-19 86 views
0

我是新來的Scala,我不明白以下代碼。如何理解scala佔位符

  • 對於// 1,什麼是=>布爾值? 「匹配器」與// 2中的 相同嗎?

  • // 3,爲什麼有兩個佔位符_?

代碼:

def filesMatching(query: String, matcher: (String, String) => Boolean //1) = { 
    for (
    file <- filesHere; // filesHere is a function that returns an Array of files 
    if matcher(file.getName, query) //2 
) yield file 
} 
def filesEnding(query: String) = 
    filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query)) 

def filesRegex(query: String) = 
    filesMatching(query, _.matches(_) //3) 

代碼是從這裏:https://mbonaci.github.io/scala/

由於

回答

0

對於(1),filesMatching是一個函數,它有兩個參數,其中一個String稱爲query,另一個是功能(String, String) => Boolean,即服用一對字符串並返回的功能一個布爾值,稱爲matcher

在(2)中,使用字符串file.getNamequery作爲參數調用此函數,返回由if使用的Boolean。 (3)中的兩個下劃線給我們留下了深刻的印象。在Scala中有幾種強調方式可以使用,所有這些基本上都是「我不需要這個名字」。這裏縮短了匿名函數的語法。請記住filesMatching的第二個參數是一個需要兩個String的函數。我們可以把它看作

def filesRegex(query: String) = filesMatching(query, (a, b) => a.matches(b)) 

換句話說,第一_是第一個參數的佔位符和第二_是第二個參數的佔位符。

+0

然後filesEnding可以重寫到這個? def filesEnding(query:String)= filesMatching(query,_.endsWith(_)) – user1615666

0

這表示一個函數,它需要兩個參數String類型的,並返回一個布爾值:

(String, String) => Boolean 

例如,我們在這裏援引filesMatching與檢查,如果所述第一串和第二串結束的功能:

filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query)) 

此參數命名matcher然後在filesMatching主體中使用。正如你所看到的,它接收兩個字符串,並返回一個布爾值:

if matcher(file.getName, query) 

最後,_只是這個功能很短的符號,每個_對應的函數參數。最後一行相當於:

filesMatching(query, (fileName: String, query: String) => fileName.matches(query))