Cela augmenterait la complexité du compilateur (et du langage). C'est vraiment génial de faire une inférence de type sur quelque chose comme ça. Comme pour tout ce qui concerne l'inférence de type, tout fonctionne mieux quand vous avez une seule expression. Les déclarations renvoyées dispersées créent effectivement beaucoup de ramification implicite qui devient très difficile à unifier. Ce n'est pas que c'est particulièrement dur, juste collant. Par exemple:
def foo(xs: List[Int]) = xs map { i => return i; i }
Qu'est-ce que, je vous demande, le compilateur en déduit ici? Si le compilateur faisait une inférence avec des instructions de retour explicites, il devrait être Any
. En fait, beaucoup de méthodes avec des instructions de retour explicites finissent par renvoyer Any
, même si vous ne vous sentez pas sournois avec des retours non-locaux. Comme je l'ai dit, collant.
Et en plus de cela, ce n'est pas une fonctionnalité de langue qui devrait être encouragée. Les retours explicites ne pas améliorer la clarté du code, sauf s'il n'y a qu'un seul retour explicite et que c'est à la fin de la fonction. La raison est assez facile à voir si vous visualisez les chemins de code comme un graphe orienté. Comme je l'ai dit plus tôt, les retours dispersés produisent beaucoup de ramification implicite qui produit des feuilles bizarres sur votre graphe, ainsi que beaucoup de chemins supplémentaires dans le corps principal. C'est juste génial. Le flux de contrôle est beaucoup plus facile à voir si vos branches sont toutes explicites (correspondance de modèle ou expressions if
) et votre code sera beaucoup plus fonctionnel si vous ne comptez pas sur les instructions return
pour produire des valeurs.
Ainsi, comme plusieurs autres « découragées » caractéristiques à Scala (par exemple asInstanceOf
plutôt que as
), les concepteurs de la langue a fait un choix délibéré pour rendre les choses moins agréable. Ceci combiné avec la complexité qu'il introduit dans l'inférence de type et l'inutilité pratique des résultats dans tous les scénarios sauf les plus artificiels. Cela n'a aucun sens pour scalac de tenter ce genre d'inférence.
Morale de l'histoire: apprenez à ne pas disperser vos retours! C'est un bon conseil dans n'importe quelle langue, pas seulement Scala.
Bonjour Daniel. Je n'ai pas votre explication. Scala doit déjà combiner plusieurs expressions et des points de sortie dans les fonctions à cause des instructions if/else. Et le langage Scala contient des tonnes de choses complexes et complexes que les programmeurs de la plupart des Scala d'IMO ne comprennent pas très bien ou n'utilisent pas (par exemple covariance/contravariance, types structurels, etc.). Cela ajoute beaucoup de complexité au compilateur; donc "rend le compilateur plus complexe" semble une réponse faible. –
@UrbanVagabond Vous avez manqué la partie "gains à être en tête". Juste parce que quelque chose est complexe ne veut pas dire qu'il vaut la peine d'y ajouter plus de complexité. Maintenant, Scala n'a pas besoin de combiner plusieurs expressions et de quitter des points sur les instructions if/else car if/else est une expression, pas des instructions. Cela peut sembler friser les poils, mais la différence est très réelle. –