2013-05-21 123 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