J'essaie de créer une classe qui possède une carte des touches -> Appels de fonction, et le code suivant ne se comporte pas comme je l'aimerais. la sortie suivante p> indique qu'une fois la fonction placée sur la carte, c'est une instance gelée (chaque clé produisant la même chose valeur pour chaque passage). Le comportement que j'aimerais voir est que la clé se réfère à un appel de fonction, générant une nouvelle valeur aléatoire plutôt que de simplement retourner l'instance détenue sur la carte. P> P>
3 Réponses :
Le problème est avec la signature de votre carte Parce que les supports sont facultatifs sur les invocations de méthode no-arg, la différence de types ici est très importante. Lorsque la carte est remplacée, les méthodes sont invoquées au moment de l'insertion afin de correspondre à la signature de type (je pense que cela se fait par une conversion implicite mais je ne suis pas sûr à 100%). P> Par simplement Modification de la signature déclarée de votre carte, les fonctions sont insérées comme vous le souhaitez et peuvent être évaluées pendant m code>. Vous avez décrit que vous vouliez mettre les fonctions em> sur la carte; Cependant, vous l'avez déclaré comme
mappe [string, double] code> qui n'est qu'une carte des chaînes à double. Le type correct serait
mappe [chaîne, () => double] code>.
Computerevalues CODE> (nécessite une modification de la ligne 35 sur
mappe + = {facteur -> valeur () } code>), entraînant la sortie suivante (testée sur SCANA 2.8): P>
0.662682479130198
0.5106611727782306
0.6939805749938253
0.763581022199048
0.8785861039613938
0.9310533868752249
Les méthodes sont vraiment invoquées au moment de l'insertion afin qu'ils reviennent doubles, mais comme des arguments de méthode zéro peuvent être appelés sans parenthèse, il n'était pas nécessaire de conversion implicite à cette fin. Voir Stackoverflow.com/q/6643030/1287856
Vous devez cartographier les clés pour fonctionner, non pas à la réponse que la fonction vous donnerait. Essayez ceci:
Merci Rex, grandement apprécié.
J'utiliserais l'inférence de type de Scala pour définir la carte. Il n'est pas nécessaire de définir les méthodes séparément, s'ils ne sont utilisés que via la carte. Aussi, vous pouvez utiliser un Val immuable, au lieu d'un var.
val m = Map( "key1" -> {() => rnd.nextDouble}, "key2" -> {() => rnd.nextDouble}, "key3" -> {() => rnd.nextDouble}, "key4" -> {() => rnd.nextDouble}, "key5" -> {() => rnd.nextDouble})
Merci, les fonctions doivent être définies séparément. Ce ne sont que des espaces réservés pour des fonctions réelles que je vais définir plus tard. Je viens d'utiliser des nombres aléatoires pour confirmer le comportement correct.
Pourquoi tant de fonctions identiques?
@Pablo. Ce ne sont que des exemples d'espaces réservés pour les fonctions que je mettront en œuvre. Je voulais avoir un univers de fonctions potentielles à appeler et appeler un sous-ensemble d'entre eux.