2009-09-25 4 views
1

Donné ce code:Pouvez-vous retourner une fonction non évaluée dans scala?

def getFunc(funcName:String, param:Int) = match funcName { 
    case "FooFunc" => FooFunc(param) 
    [...] 
} 

def FooFunc(param:Int) = param + SomeObject.SomeVariable 

Comment pourrais-je revenir FooFunc avec param appliqué, sans l'évaluer? La raison pour laquelle je voudrais faire cela est parce que FooFunc, comme vous pouvez le voir, repose sur une variable externe, donc je voudrais être en mesure de l'appeler avec param déjà appliqué. Quel devrait être le type de retour de getFunc?

Répondre

2

Le lazyness doit être défini sur le site d'appel, en Scala. Vous pouvez faire:

lazy val x = getFunc(...) // getFunc only gets evaluated when needed 

Ou vous pouvez changer la signature:

def FooFunc(param:Int) =() => param + SomeObject.SomeVariable 
... 
val x = getFunc(...) // x contains a function from Unit into something 

x() // Use x here, causing the evaluation 
1

Vous pouvez ajouter un autre paramètre void, de sorte que la fonction n'est évaluée que lorsqu'elle est appliquée à ce paramètre.

Bien que je préfère utiliser un objet approprié au lieu d'une fonction dans ce cas.

1

Je suis sûr qu'il ya beaucoup d'options, mais vous pouvez utiliser:

return { Unit => FooFun(param) } 
5

Facile:

def getFunc(funcName: String, param: Int) = funcName match { 
    case "FooFunc" =>() => FooFunc(param) 
    [...] 
} 

Votre méthode a un nom: getFunc est censé retourner une fonction, il volonté.

Questions connexes