Любому методу, который ожидает функцию с некоторым аргументом, можно вместо этого передать метод с одним аргументом, и, если типы сработают, метод будет автоматически преобразован.
Таким образом, все они действительны:
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
будет медленнее, поэтому фактически он просто пишет метод справильный байт-код.)
Только если правильное преобразование не происходит автоматически (например, из-за неоднозначности или если вы хотите присвоить его переменной), вам нужно использовать _
для созданияфункция вне метода.(И тогда не всегда точно понятно, используете ли вы _
для преобразования из метода в функцию или используете _
в качестве заполнителя для ввода; к счастью, результат одинаков в любом случае.)