2011-04-25 3 views
2

Si je comprends bien, les types de fonction dans Scala compiler aux instances de FonctionN. Alors que par exemple cet exempleComment les fermetures Scala sont-elles implémentées dans Scala.NET?

List(1,2,3).filter(_ >= 2) 

signifie

List(1,2,3).filter(new Function1[Int,Bool]{def apply(_$1:Int) = _$1 >= 2;}) 

Comment cette mise en œuvre en Scala.NET? Si je comprends bien, .NET n'a pas de classes anonymes au niveau de l'instruction. Et la solution ci-dessus dépend de l'existence de classes anonymes.

+0

Mais ils ne peut pas implémenter des interfaces à droite? Donc, ils n'aident pas vraiment dans ce cas? – keiter

+0

@Heandel, il y a des types anonymes dans ** C# **, mais ils n'ont rien à voir avec ça. – svick

+0

Aucune idée, mais il n'y a pas non plus de classes anonymes dans le bytecode Java. –

Répondre

4

Je ne sais pas quoi que ce soit à propos de Scala, mais je ne vois pas pourquoi cela ne devrait pas être mis en œuvre de la même manière que les fermetures C#, à savoir le code suivant:

new List<int>{1,2,3}.Where(i => i >= 2) 

Ce code est mis en œuvre par créer une nouvelle fonction dans la classe actuelle. Si vous avez vraiment créé une fermeture:

int max = 2; 
var result = new List<int> { 1, 2, 3 }.Where(i => i >= max); 

qui serait mis en œuvre par la création d'une nouvelle classe qui contient la max variable avec la fonction anonyme.

EDIT:

Je viens d'essayer la compilation de votre code à l'aide Scala.Net et regardant le code compilé dans le réflecteur donne ceci:

int[] numArray1 = new int[] { 1, 2, 3 }; 
List$.MODULE$.apply(new BoxedIntArray(numArray1)).filter(new $anonfun$1()); 

$anonfun$1 est une classe qui implémente l'interface Function1 et sa fonction apply() ressemble à ceci:

public sealed override bool apply(int x$1) 
{ 
    return (x$1 >= 2); 
} 
Questions connexes