2013-05-21 2 views
5

Привет всем Я пытаюсь понять символ «_» в scala, это выглядит как шаблон, но я не понял, почему в данном сценарии.почему scala placeholder не работает

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 {_ * _ } 'is not. Если вам нужно ссылаться на одну и ту же переменную несколько раз, назовите ее:' foreach {x => x * x} ').) –

ответ

12

Подстановочные знаки в анонимных функциях расширяются таким образом, что n-th _ рассматривается как n-й аргумент. Способ, которым вы его используете, делает компилятор scala, который, на самом деле, имеет что-то вроде

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

Это, очевидно, недействительно.

+6

Он анализирует' l.foreach ({if ((x) = > x == "a") {(y) => print (y)}}) '. – Debilski

Смежные вопросы