ti-enxame.com

Diferenças entre essas três maneiras de definir uma função em Scala

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 nenhuma diferença óbvia:

scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
92
qrest

f1 é uma função que pega um número inteiro e retorna um número inteiro.

f2 é um método com zero aridade que retorna uma função que pega um número inteiro e retorna um número inteiro. (Quando você digita f2 em REPL mais tarde, torna-se uma chamada para o método f2.)

f3 é o mesmo que f2. Você simplesmente não está empregando inferência de tipo lá.

112
missingfaktor

Dentro de uma classe, val é avaliada na inicialização enquanto def é avaliada apenas quando, e toda vez, a função é chamada. No código abaixo, você verá que x é avaliado na primeira vez em que o objeto é usado, mas não novamente quando o membro x é acessado. Por outro lado, y não é avaliado quando o objeto é instanciado, mas é avaliado sempre que o membro é acessado.

  class A(a: Int) {
    val x = { println("x is set to something"); a }
    def y = { println("y is set to something"); a }
  }

  // Prints: x is set to something
  val a = new A(1)

  // Prints: "1"
  println(a.x)

  // Prints: "1"                               
  println(a.x)

  // Prints: "y is set to something" and "1"                                  
  println(a.y)

  // Prints: "y is set to something" and "1"                                                                                   
  println(a.y)
122
Jack

Executando uma definição como def x = e não avaliará a expressão e . Em vez disso e é avaliado sempre que x é usado. Como alternativa, 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 posteriormente, é imediatamente substituído pelo valor pré-calculado de e , para que a expressão não precise ser avaliada novamente.

Scala por exemplo por Martin Odersky

3
Alexander