2014-10-23 3 views
0

У меня есть функция, определенная какПочему вызов функции никогда не выполняется?

def counter(x: Int) = { 
    var i = x 
() => { 
    i = i + 1 
    println(i) 
    } 
} 

val count = counter(0) 

count Так функция не принимая параметр возвращения блока. Тогда круглые скобки могут быть опущены при вызове count. Но если я позвоню, просто скажу, что count, i на самом деле не будет добавлен, и ничего не произойдет. Тем временем, предупреждение компилятора будет дано как «Чистое выражение ничего не делает, вы можете исключить скобки».

Если я назову его круглыми скобками, например count(), все будет в порядке и увеличено i будет напечатано.

Почему говорить count не работает? Спасибо.

ответ

0

Ваш счетчик (x: Int) фактически возвращает функцию() => {...}, которую вы определили (которая возвращает Unit и генерирует предупреждение компилятора).

Таким образом, вызывая счет с помощью круглых скобок, вы фактически выполняете функцию.

Если я desugar определение типа, вы получите:

def counter(x: Int):() => Unit = { 
    var i = x 
() => { 
    i = i + 1 
    println(i) 
    } 
} 

val count:() => Unit = counter(0) 
+0

Но это функция без аргументов, поэтому я полагаю, я мог назовите его без круглых скобок, просто говоря 'count', а не' count() '? – Leigh

1

Вы не можете вызвать функцию без скобок. В scala вы можете позвонить method без аргументов без круглых скобок. Метод, но не функция.

Фактически «функция вызова» означает «метод вызова apply объекта типа FunctionN» в scala.

So count() средства count.apply(). Вы можете вызвать метод apply без круглых скобок, таких как: count.apply.

+0

А я вижу ... Большое вам спасибо. – Leigh

0

A Function0 точно не соответствует беспараметрическому методу. То есть:

val returnOne =() => 1 

// approximates 
def returnOne() = 1 

// rather than 
def returnOne = 1 

В самом деле, когда вы поднимаете метод без параметров к Function0 поведение метода без параметров теряется:

// Define a parameterless method 
scala> def returnOne = 1 
returnOne: Int 

// Every time you reference the method it is evaluated 
scala> returnOne 
res2: Int = 1 

// Lift the method to a Function0 
scala> returnOne _ 
res3:() => Int = <function0> 

// Now a reference to the lifted method evaluates to the lifted method 
scala> res3 
res4:() => Int = <function0> 

// And you have to invoke it explicitly 
scala> res3() 
res5: Int = 1 
Смежные вопросы