-1

Dans l'extrait de Scala suivant, j'essaie de m'assurer que la plus grande partie de l'expression est "précompilée", de sorte que l'application complète finale de la fonction littérale engendre peu de cycles que possible. c'est-à-dire que je veux m'assurer que la condition if est évaluée au moment de l'affectation fonction-littérale plutôt que plus tard au moment de l'application de la fonction-literal au paramètre non lié.Scala ambiguïté de l'évaluation partielle de la fonction-valeur (inline?)

private val tokenFilterFactory: TokenStream => TokenStream = 
    if(augment) { 
    new AugmentingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) 
    } 
    else { 
    new ReplacingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) 
    } 

Ce que je veux est d'appliquer alors le nombre fonctionnel un littéral grand nombre de fois, comme tokenFilterFactory (tokenStream)

Ma question: Est-ce la if(augment) conditionnelle être exécuté à chaque fois est appliqué la fonction littérale (mauvais), ou sera-t-il exécuté une seule fois, quand la fonction littérale est définie/assignée? Contexte: scala 2,11

équivalente, est le val-attribution ci-dessus équivalente à la gestion du temps (seule évaluation de WRT, pas « cessibilité ») à l'extrait suivant:

private var tokenFilterFactory: TokenStream => TokenStream = _ 
if(augment) { 
    tokenFilterFactory = new AugmentingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) 
} 
else { 
    tokenFilterFactory = new ReplacingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) 
} 

C'est, je voudrais que le l'ancien code pour agir comme le dernier. Est-ce déjà le cas? Je me rends compte que je peux juste essayer avec quelques printlns, mais peut-être quelqu'un peut-il faire la lumière sur les limitations sur les optimisations bytecode qui affectent ce scénario?

+1

"Je réalise que je peux juste l'essayer" exactement! – Dima

+0

Merci pour la motivation :-) –

Répondre

0
def condition(): Boolean = { 
    println("conditional evaluated") 
    true 
} 
private val intModifier: Int => Int = 
    if(condition()) { 
    _ + 1 
    } else { 
    _ - 1 
    } 

intModifier(1) 
intModifier(2) 

sortie:

condition: condition[]() => Boolean 



conditional evaluated 
intModifier: Int => Int = <function1> 


res0: Int = 2 
res1: Int = 3 

si la version val fonctionne comme prévu, à savoir le bytecode est déjà optimisée.