2010-11-11 7 views
31

Pas que je suis venu près de cette limite, mais je me suis toujours demandé: Pourquoi s'arrêtent-ils à Function22/Tuple22. Restriction JVM? Choix arbitraire?Pourquoi les fonctions scala sont-elles limitées à 22 paramètres?

+1

http://scala-programming-language.1934581.n4.nabble.com/Scala-API-why-like-this-td1952388.html – rwong

+0

http://jnordenberg.blogspot.com/2008/09/hlist -in-scala-revisited-or-scala.html – rwong

+0

Ces limites sont toujours là 6 ans plus tard: http://stackoverflow.com/a/39981285/6309 – VonC

Répondre

29

Fonctions et tuples sont réécrites sous forme d'objets par le compilateur, et seulement Function0 par Function22 et Tuple0 par Tuple22 sont définis. Je pense que la limite de 22 est entièrement arbitraire, mais la raison d'avoir une limite n'est pas. Pensez-y de la façon suivante: pour exécuter une application Scala, les classes nécessaires à son exécution doivent être présentes. Si le compilateur crée dynamiquement des classes pour les fonctions, ces classes ne seront pas incluses dans le fichier JAR de la bibliothèque Scala, vous devrez donc les inclure dans votre application. Cela pourrait fonctionner, mais alors vous auriez le problème de ce que les noms complets des classes devraient être: s'ils étaient identiques pour toutes les applications, vous auriez des conflits puisque les bibliothèques contiendraient les mêmes classes, et si les noms n'étaient pas les même si vous vous retrouvez avec des incompatibilités - les fonctions des bibliothèques ne seraient pas les mêmes que les fonctions de votre application.

+3

C'est en fait Tuple1 à Tuple22, mais ce n'est qu'un détail mineur. –

+8

@DarianLewin 'Tuple0' s'appelle' Unit' – Apocalisp

+0

Toujours pas très convaincu pourquoi ces classes ne devraient pas être générées dynamiquement par le compilateur. Le problème de nommage et d'emballage pourrait être résolu facilement en suivant une convention de nommage. Je ne sais pas si je manque la grande image. –

11

Il est la plupart du temps arbitraire, mais sont certaines limites sous-jacentes sur la JVM qui dictent à peu près ce que la limite doit être.

Le problème principal est l'appariement de modèles sur des classes de cas. Si une classe de cas permettait d'être beaucoup plus grande, le code de correspondance de motif généré pourrait très facilement dépasser la taille maximale de la méthode valide. Tout le reste (Product, Function, Tuple, ...) suit simplement la limite de 22 paramètres qui a donc été choisie pour les classes de cas.

aussi ... Si vous écrivez des fonctions/tuples avec> 22 paramètres alors vous êtes probablement en retard pour une refonte :)

+17

Parfois ce n'est pas votre design. Supposons que vous écrivez une classe de cas pour représenter un message de protocole réseau comportant plus de 22 paramètres. Ou l'analyse d'une réponse JSON d'un serveur que vous ne contrôlez pas. – Chad

+0

@Chad: D'accord. Parfois, il n'est pas possible de changer le design. – tuxdna

22

Il n'y a pas de limite. Même si les bibliothèques standard ne définissent que la fonction 22, vous pouvez définir Function23 si vous en avez besoin, jusqu'à la limite de la JVM. Ou vous pouvez grouper des arguments en tuples. Ou vous pouvez simplement cesser de prétendre que toute fonction prend plus d'un argument:

a => b => c => d => e => ... 

fonctions cari peuvent prendre autant d'arguments que vous le souhaitez.