странный синтаксис в лямбда-выражении - PullRequest
4 голосов
/ 20 сентября 2010
val (xa, xb) = xs partition ( a > )

Что такое a > в приведенном выше коде и чем оно отличается от a > _? (предположим, a является некоторым заранее заданным значением)

Ответы [ 3 ]

11 голосов
/ 21 сентября 2010

Любому методу, который ожидает функцию с некоторым аргументом, можно вместо этого передать метод с одним аргументом, и, если типы сработают, метод будет автоматически преобразован.

Таким образом, все они действительны:

class C { def go(i: Int) = -i }
val c = new C
List(1,2,3).foreach( println )
List(1,2,3).map( c go )

Итак, либо a имеет определенный метод >, либо он может быть неявно преобразован во что-то с помощью метода >.Например, это работает:

List(1,2,3).partition(2 >)

, потому что (РЕДАКТИРОВАТЬ: можно было бы думать , это было бы верно ....) существует неявное преобразование из Int в RichInt(тот же, что дает вам .toFloat и тому подобное), и RichInt имеет определенный метод >.partition ожидает функцию, которая принимает Int и возвращает Boolean, а 2 > - метод, который принимает Int и возвращает Boolean.Таким образом, преобразование происходит автоматически.

(РЕДАКТИРОВАТЬ: но, как указывает @Lukas Rytz, это даже более сложно, чем это, потому что компилятор понимает, что он может специально обрабатывать примитивные целочисленные значения, поэтому даже если > нена самом деле это метод для объекта 2, поскольку 2 не является объектом, и примитивы не имеют методов, компилятор распознает, что откладывание до RichInt будет медленнее, поэтому фактически он просто пишет метод справильный байт-код.)

Только если правильное преобразование не происходит автоматически (например, из-за неоднозначности или если вы хотите присвоить его переменной), вам нужно использовать _ для созданияфункция вне метода.(И тогда не всегда точно понятно, используете ли вы _ для преобразования из метода в функцию или используете _ в качестве заполнителя для ввода; к счастью, результат одинаков в любом случае.)

2 голосов
/ 20 сентября 2010

Это ничем не отличается, это просто более короткая версия.

1 голос
/ 20 сентября 2010

Я думаю, что это на самом деле точно так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...