2015-01-02 46 views
1

添加副作用,在下面的斯卡拉循環Scala的產量聲明

private val tpath = for (csvPath <- CsvPaths 
    if new java.io.File(csvPath).exists() 
) yield csvPath 

我想補充一個println副作用 - 類似以下內容:

private val tpath = for (csvPath <- CsvPaths 
    if new java.io.File(csvPath).exists() { // Following is illegal syntax 
    println(s"Following path exists $csvPath") 
    } 
) yield csvPath 

那麼,有沒有語法爲for/yield循環添加副作用?

回答

6

您可以使用_分配:

for { 
    csvPath <- CsvPaths 
    if (new java.io.File(csvPath).exists()) 
    _ = println(s"Following path exists $csvPath") 
} yield csvPath 

當然這個具體的例子,你可以只使用一個塊產量:

for { 
    csvPath <- CsvPaths 
    if (new java.io.File(csvPath).exists()) 
} yield { 
    println(s"Following path exists $csvPath") 
    csvPath 
} 

但上述技術是有用的,如果您希望在更多的<-行之後將呼叫置於for/yield鏈的「中間」。

+0

中'if'子句的過濾操作不熟悉_賦值。你能解釋一下更多關於如何/何時可以使用? – javadba

+0

看起來像是「不理我」。所以是的,似乎語法是必需的,因爲需要在該位置進行分配。 – javadba

+0

語法'_ < - ...'與'case _ => ...'類似 - 您常常可以將'<-'的左側視爲模式匹配。 – Dylan

-1
for { 
    csvPath <- CsvPaths 
    _ = if(new java.io.File(csvPath).exists()) println(...) 
} yield csvPath 

for { 
    csvPath <- CsvPaths 
} yield { 
    if(new java.io.File(csvPath).exists()) println(...) 
    csvPath 
} 
+1

它丟失原始 –