2013-05-21 145 views
5

大家好我想了解scala中的符號「_」,它看起來像一個通配符,但我不明白爲什麼在給定的場景。爲什麼scala佔位符不工作

var l = List("a","b" ,"c") 
    // Works "s" works as a variable. 
    l.foreach(s => 
    if(s=="a"){ 
     print(s) 
    } 
    ) 

    // Works _ takes the place of "s" 
    l.foreach(
    print(_) 
    ) 

    //So the doubt is whether "_" is a wildcard that does not work well. 

    l.foreach(
    if(_=="a"){ 
     print(_) 
    } 
) 

「_」應該像變量s一樣行動,但它爲什麼不行?

+0

我約99.8973%肯定'_'工作得很好。這就是你如何使用它,或者你對它的期望,這就是問題所在。 – cHao

+4

你應該閱讀http://stackoverflow.com/questions/8000903等等。我想,你在混合使用下劃線。 (另外,下劃線每個變量只能使用一次;第二個下劃線試圖綁定到第二個變量,而不是第二個變量,因此:'foreach {_ + 1}'沒問題,'foreach {_ *如果你需要多次引用同一個變量,可以命名爲:'foreach {x => x * x}')。) –

回答

12

匿名函數中的通配符以第n個_被視爲第n個參數的方式展開。你使用它的方式會讓scala編譯器認爲你實際上有類似的東西

l.foreach((x,y) => 
    if(x=="a"){ 
     print(y) 
    } 
) 

這顯然是無效的。

+6

它解析爲'l.foreach({if((x)= > x ==「a」){(y)=> print(y)}})',儘管如此。 – Debilski