2016-03-23 2 views
-1

Я запутался об определениях анонимных функций следующим образом:что разница между Def и вар/Валу для анонимной функции

var plusOne = (x:Int)=>x+1 
// or val plusOne=(x:Int)=>x+1 
println(plusOne(2)) 

Или

def plusOne = (x:Int)=>x+1 
println(plusOne(2)) 

Какая разница, пожалуйста, в var/val и def для имени функции.

+1

Возможный дубликат [Практическое различие между def f (x: Int) = x + 1 и val f = (x: Int) => x + 1 в Scala] (http://stackoverflow.com/questions/22354396/practice-difference-between-def-fx-int-x1-and-val-fx-int-x1-in) –

+0

Это не имеет ничего общего с функциями. Разница между 'var',' val' и 'def' не имеет ничего общего с их типом. 'var' и' val' - это поля («переменные», если вы это сделаете), 'def' - это метод.Неважно, что они возвращают. –

ответ

5
  • вал объявляющий «непреложный переменную или скорее символ», который не позволяет переназначение, правая часть задания оценивается сразу
  • вар объявляет «изменчивая переменная», которая позволяет переназначать позже символу, правая часть присваивания сразу вычисляется так же, как val
  • def объявляет «неизменный символ», который не позволяет переназначить, правая сторона оценивается лениво,то есть всякий раз, когда этот символ ссылается позже в коде

Пример -

var plusOneVar = (x:Int)=>x+1 
val plusOneVal = (x:Int)=>x+1 
def plusOneDef = (x:Int)=>x+1 

plusOneVar = (x:Int)=>x+2 // Reassignment to var is valid 
plusOneVal = (x:Int)=>x+2 // Compile time error, reassignment to val 
plusOneDef = (x:Int)=>x+2 // Compile time error, reassignment to val 

Потому что вы смотрите на пример с функциями, это трудно понять. Попробуем понять это с помощью простых переменных.

var symbolVar = 100  // line 1 
val symbolVal = symbolVar // line 2 
def symbolDef = symbolVar // line 3 

println(symbolVar) // prints 100 
println(symbolVal) // prints 100 
println(symbolDef) // prints 100 - no surprise yet 

symbolVar = symbolVar + 1 

println(symbolVal) // still prints 100 which was evaluated and assigned on line 2 
println(symbolDef) // prints 101 as symbolDef is a def and it depends on symbolVar, line 3 is evaluated again 
2

var plusOne можно переназначить. val plusOne не может быть переназначен. Оба оцениваются один раз. def plusOne вычисляется каждый раз, когда она называется

+0

ну, var plusOne изменен на val plusOne, какая разница с def please :) – Jack

+0

Извините, я не могу понять, не могли бы вы дать простой пример кода. Большое спасибо! – Jack

+0

Возможно, вы захотите сделать более понятным, что именно оценивается раз vs каждый раз. –

1

Отметим также с val (или var) один экземпляр функции создается и используется для любого числа вызовов к этой функции, тогда как с def новый экземпляр функции создается для каждого вызова. Тем не менее, для

def f (i:Int) = i+1 
f: (i: Int)Int 

нота

val g = f _ 
g: Int => Int = <function1> 
0

Это может быть ясно из результатов дизассемблера класса File, используя javap. Сохраните следующий код в Test.scala

class Test { 
    val fVal: Int => Int = x => x + 1 
    var fVar: Int => Int = x => x + 1 
    def fDef(x: Int): Int = { x + 1 } 
} 

и сделать scalac Test.scala; javap Test покажет

Compiled from "Test.scala" 
public class Test { 
    public scala.Function1<java.lang.Object, java.lang.Object> fVal(); 
    public scala.Function1<java.lang.Object, java.lang.Object> fVar(); 
    public void fVar_$eq(scala.Function1<java.lang.Object, java.lang.Object>); 
    public int fDef(int); 
    public Test(); 
} 

Как показали результаты выше, val и fVar представлены как методы, которые возвращают объект Function1. Разница в fVar имеет дополнительный «сеттер». Хотя fDef похож на обычный Java-метод.

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