2013-06-18 1 views
0

Этот вопрос не касается рекомендуемых методов обозначения в цепочке методов, о понимании этого конкретного случая.Смешивание пробелов и точек в цепочке меток в Scala

Я изучаю Scala и Play около 2 недель. У меня есть опыт работы один месяц обучения в Скале когда-то в 2011 году

У меня возникают проблемы с пониманием, почему эта линия не работает

List(1,2,3) map {x=>x*2}.filter((x:Int)=>x==2) 

Но это один работает

List(1,2,3).map{x=>x*2}.filter((x:Int)=>x==2) 

Одной из причин Я могу думать, что фильтр вызывается из значения функции, а не в результате сбора.

Почему он все еще не работает, когда помечены обозначения Space и Dot? Если я сохраню чистое обозначение Space или Dot, тогда это работает иначе.

Я бы не смутился, если бы везде видел чистые обозначения. Я видел смешанную нотацию, особенно в кодовой базе Play. Что мне не хватает?

ответ

3

Работает должным образом.

Эта линия:

List(1,2,3) map {x=>x*2}.filter((x:Int)=>x==2) 

означает

List(1,2,3) map ({x=>x*2}.filter((x:Int)=>x==2)) 

Это, безусловно, ошибка, но вы могли бы использовать его как это:

val f1 = (x: Int) => x * 2 
val f2 = (x: Int) => x + 2 

List(1,2,3) map f1.andThen(f2) // List(1,2,3).map(f1.andThen(f2)) 
//List[Int] = List(4, 6, 8) 

Этот код создает новую функцию в качестве композиции из 2 функций: {(x: Int)=>x*2}.andThen((x:Int)=> x + 2), а затем применяется метод map.

Вы можете смешивать пространственные или точечные обозначения, но вы должны знать, что «приоритет» точки выше.

+0

Таким образом, он интерпретирует это как одно выражение. Да, это имеет смысл! – codecool

+0

'Список (1,2,3) map (x => x * 2) filter ((x: Int) => x == 2)' также делает трюк. –

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