2012-04-06 6 views
5

Lo que sigue es un proceso manual¿Forma de convertir automáticamente el método de clase para funcionar tomando un argumento de clase explícito en Scala?

case class A(x: Int) { def f(y: Int) = x * y } 
val af: (A => Int => Int) = _.f 

val a = A(4) 
val r = af(a)(2) 

¿Hay alguna manera con inmejorables posibilidades para conseguir una función como af? Algo así como A magic f, posiblemente sin usar la reflexión. La capacidad de importar todos los métodos públicos de una clase a través de import A#magic._ es una ventaja.

Respuesta

11

De esta manera es más corto 10 símbolos:

val af = (_: A).f _ 
2

Puede crear una instancia de A y de importar los métodos:

val a = A(4) 
import a._ 

No hay otra forma de hacer esto, porque x tiene que contener un valor. aunque se puede crear un objeto único lugar af una clase y cambiar sus firmas de los métodos en consecuencia:

object A { 
    def f(x:Int)(y:Int) = x*y 
} 

import A._ 

Por lo que yo sé que no es posible convertir todos los métodos de una clase en curry (constructor)(method signature) funciones.

2

No sé qué quieres eso, sino que de hecho u puedo lograr lo siguiente:

scala> case class A(x:Int){ def f(y:Int)=x*y} 
defined class A 

scala> val af = A(2).f _ 
af: (Int) => Int = <function1> 

scala> af(3) 
res0: Int = 6 
Cuestiones relacionadas