Dadas três maneiras de expressar a mesma função f(a) := a + 1
:
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Como essas definições diferem? O REPL não indica quaisquer diferenças óbvias:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
f1
no REPL mostra o valor vinculado estaticamentef1
ao avaliarf2
ef3
mostra o resultado da chamada desses métodos. Em particular, uma novaFunction1[Int, Int]
instância é produzida toda vez quef2
ouf3
é invocada, enquantof1
é a mesmaFunction1[Int, Int]
para sempre.Respostas:
f1
é uma função que pega um inteiro e retorna um inteiro.f2
é um método com aridade zero que retorna uma função que recebe um inteiro e retorna um inteiro. (Quando você digitaf2
em REPL mais tarde, torna-se uma chamada para o métodof2
.)f3
é o mesmo quef2
. Você simplesmente não está empregando inferência de tipo aqui.fonte
f1
é umfunction
ef2
é ummethod
?apply
. Um método, bem, é um método.f2
si só não aceita argumentos. O objeto de função que ele retorna sim.Dentro de uma classe,
val
é avaliado na inicialização, enquantodef
é avaliado apenas quando, e todas as vezes , a função é chamada. No código abaixo, você verá que x é avaliado na primeira vez que o objeto é usado, mas não novamente quando o membro x é acessado. Em contraste, y não é avaliado quando o objeto é instanciado, mas é avaliado toda vez que o membro é acessado.fonte
a
é imutável e avaliada na inicialização, masb
permanece um valor mutável. Portanto, a referência ab
é definida durante a inicialização, mas o valor armazenado porb
permanece mutável. Para se divertir, agora você pode criar um novoval b = 123
. Depois disso, vocêa(5)
sempre dará 11, poisb
agora é um valor completamente novo.Executar uma definição como def x = e não avaliará a expressão e . Em vez disso, e é avaliado sempre que x é usado. Alternativamente, Scala oferece uma definição de valor val x = e , que avalia o lado direito e como parte da avaliação da definição. Se x for usado subsequentemente, ele será imediatamente substituído pelo valor pré-calculado de e , de modo que a expressão não precise ser avaliada novamente.
fonte