Это метод с одним параметром Int
имени x
, который возвращает Int
(х + 1), где тип возвращаемого Int
выводится компилятором.
def incImplicit(x: Int) = x + 1
Это тот же точный метод, что и выше, за исключением того, что тип возврата является явным и не выводится.
def incImplicit(x: Int): Int = x + 1
Это метод , что без параметров возвращает Function1[Int, Int]
(который представляет собой функцию с одним параметром, который Int
возвращает Int
).
def incAnonymous = ((x : Int) => x + 1)
т.е. длинная подпись выглядит следующим образом:
def incAnonymous: Function1[Int, Int] = ((x : Int) => x + 1)
Или
def incAnonymous: Int => Int = ((x : Int) => x + 1)
Функционально, они в значительной степени то же самое. Если в качестве параметра требуется Int => Int
, скажем, для def map(f: Int => Int)
, все они будут работать. При вызове map(incImplicit)
первые два (одинаковые точные методы, в любом случае) будут неявно преобразованы в функции на eta-expansion. map(incAnonymous)
уже будет иметь правильную подпись и не требует преобразования.
incImplicit(x)
и incAnonymous(x)
всегда будут возвращать тот же результат для любого x
. Единственное отличие состоит в том, что incImplicit
является одним вызовом метода, а incAnonymous
- это вызов метода, который возвращает функцию, и затем вызывается метод возвращаемой функции apply
. Как правило, у вас не будет метода, который возвращает функцию, если у вас нет веских оснований для этого.
Как указано REPL, нет никакой разницы между первым и вторым объявлением, оба являются '(x: Int) Int' – cchantep
Для подробной информации о разнице между вашим вторым и третьим вариантами взгляните на [ http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala](http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in -scala) – badcook