La función de Scala como uso de parámetros.

class ClosureClass {
  def printResult[T](f: => T) = {
    println("choice 1")
    println(f)
  }

  def printResult[T](f: String => T) = {
    println("choice 2")
    println(f("HI THERE"))
  }
}

object demo {
  def main(args: Array[String]) {
    val cc = new ClosureClass
    cc.printResult()   // call 1
    cc.printResult("Hi")  // call 2
  }
}

Juego con el código anterior y el resultado me lo mostró. Tengo dos preguntas

1) ¿Por qué tanto la llamada 1 como la llamada 2 entran en la opción 1?

2) ¿Cómo puedo pasar un parámetro para poder acceder a la opción 2?

Gracias,

choice 1
()
choice 1
Hi

preguntado el 22 de mayo de 12 a las 07:05

1 Respuestas

El tipo => T significa que f es un parámetro de llamada por nombre. Esto significa que f es de tipo T, y la expresión pasada a la función se evaluará cuando se use (no cuando se llame a la función.

El tipo String => T significa que f es un Function[String,T], es decir, una función de un String a una T.

Cuando llamas con "Hi", String como argumento, Scala ve que hay dos opciones para printResult:

1) => T: En este caso caso T se uniría a String, lo cual está bien.

2) String => T: Esto no funciona desde String no es una función de String a cualquier cosa... no es una función en absoluto.

La forma en que solucione esto depende de lo que esté tratando de hacer. Si solo quieres arreglar cómo printResult está siendo llamado, entonces usted llama llamarlo con:

val g: (String => String) = (s: String) => s + "***"
cc.printResult(g)

que imprime:

choice 2
HI THERE***

ya que ahora estás pasando correctamente un función, g, de String Para algo T. Que T aquí está String, ya que la función solo está sumando *** al final de lo que sea que se pase y devolver la cadena modificada.

contestado el 22 de mayo de 12 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.