2010-01-23 10 views

Répondre

1

et pour compléter deamon et Daniel, voici une autre:

abstract class A { def f: (Int)=>Int } 
class B extends A { val f = identity _ } 
class C extends A { def f = identity _ } 
class D extends A { def f = (x:Int) => -x } 

Si vous êtes coincé avec une définition normale, le mieux que vous pouvez faire est

abstract class Z { def f(x:Int):Int } 
class Y extends Z { def f(x:Int) = identity(x) } 
7

Vous pouvez utiliser un champ de type fonction comme ceci:

abstract class A { val f: (Int) => Int} 

val identity = (x: Int) => x*x 

class B extends A { override val f = identity } 
+1

Et est-il une différence entre une méthode et une valeur comme celui-ci? (L'identité de P.S. est déjà définie par l'ID Predef, et je ne veux pas qu'elle corrige l'argument;) –

+3

Les méthodes de Scala ne sont * pas * des entités de première classe. Les valeurs sont. Les fonctions sont des valeurs (les fonctions doivent être de première classe pour à peu près n'importe quelle définition d'un langage fonctionnel). Les méthodes sont levées pour les fonctions grâce à une application partielle. –

3

Juste pour compléter l » answerdeamon, voici un autre exemple:

abstract class A { val f: (Int) => Int } 
class B extends A { val f: (Int) => Int = identity _ } 
Questions connexes