Pourquoi ne pas Aller de permettre imbriqués les déclarations de fonction (les fonctions à l'intérieur des fonctions)?

Edit: Si il n'était pas clair ce que je demande: quels sont les problèmes qui sont atténués en ne permettant pas imbriquées les déclarations de fonction?

Lambdas comme prévu:

func main() {
    inc := func(x int) int { return x+1; }
}

Toutefois, la déclaration suivante à l'intérieur d'une déclaration n'est pas permis:

func main() {
    func inc(x int) int { return x+1; }
}

Pour quelle raison sont des fonctions imbriquées pas permis?

  • hmm je ne sais pas si vous vouliez faire ce func main() { func (x int) int { return x+1; }(3) }
  • mais c'est une lambda ainsi, n'est-ce pas? Je ne comprends pas votre commentaire...
  • quelles fonctionnalités permettant le deuxième exemple de la syntaxe permettre, qui n'est pas pris en charge par le premier cas?
  • c'est une expression lambda, je ne pense pas que vous pouvez déclarer une fonction à l'intérieur d'une autre fonction comme JS. Je dirais donc que votre meilleur ajustement est d'utiliser les lambdas.
  • Une possibilité serait de mettre en œuvre le moyen le JavaScript n', essentiellement de l'affectation d'une fonction à une variable est très différente de celle de la déclaration d'une fonction en raison de l'écoulement de contrôle des effets sur les variables, tandis que les fonctions en JavaScript ne sont pas affectés. Cela signifie que vous pourriez appeler inc() dans le deuxième exemple, avant la déclaration. Mais! Je suis à la recherche pour des raisons, je ne connais pas trop y Aller, mais je voudrais savoir ce que la logique qui sous-tend cette règle a été.
  • oui, je sais, je ne suis pas vraiment de la programmation rendez-vous dès maintenant, et si j'étais lambdas me conviendrait très bien. Je me demandais pourquoi les concepteurs ont choisi de faire de cette façon et pas l'autre, c'est tout.
  • Eh bien, si il ya une chose que je ne faisais pas de JS est l'étendue mess 🙂 Aussi garder à l'esprit que Go est compilé, les fonctions qui ne sont pas des lambdas ne sont pas créés au moment de l'exécution. en JS tout ce qui est créé lors de l'exécution.
  • Je ne vois pas comment le fait de changer le système de déclaration serait de faire des choses différentes, je suis assez d'accord avec Not_a_Golfer ici. J'ai entendu plusieurs fois de la Go dev team, ils ne veulent pas de multiples syntaxe de déclaration de tout ce qui cause de graves dégâts dans le long terme.
  • la chose drôle est que Rob Pike a fait une drôle de commentaire sur la façon dont JS/Ruby/Python devs ont presque pas de notion de portée. twitter.com/rob_pike/status/402853302464831488
  • oups je faisais allusion à ce tweet -> twitter.com/rob_pike/status/402853390973026305
  • pour être juste, Python est assez stricte sur les étendues la plupart du temps, vous ne pouvez même pas l'assigner à une variable globale dans une fonction sans la global mot-clé, et il est rarement utilisé. Le seul cas qui causent de la confusion sont statiques vs les membres de l'instance.
  • double possible de N'Allez avoir des expressions lambda ou quelque chose de similaire?
  • Pourquoi les downvotes? Je l'ai fait essayer à la recherche mais tous, je suis venu avec était un Google Groupes thread demander la même chose mais pas de réponses utiles. Si il n'était pas clair, j'ai édité maintenant. Je ne vois pas comment il serait "pas utile" - il pourrait être intéressant de problèmes qui pourraient découler de ces fonctions imbriquées...
  • Aussi quels sont exactement la portée de problèmes que les gens sont en train de parler? Peut-on avoir un résumé qui montre ce que les Go ne différemment et comment est-ce mieux? Je suis à la recherche moi-même, mais si vous avez eu une belle source de qui allait l'aider.
  • Trouvé quelque chose sur le JavaScript de délimitation de l'étendue des questions: dailyjs.com/2012/07/23/js101-scope.
  • Je voudrais juste ajouter que la question proposée comme un doublon ne demande pas la même chose!
  • vieux post, mais pour le dossier: "cela signifie Que l'on pourrait appeler inc() dans le deuxième exemple, avant la déclaration" > ceci est spécifique à Javascript et généralement appelé déclaration de fonction de levage. Golang (comme la plupart des autres langages de programmation) ne pas hisser les déclarations de fonction. Je pense que c'est une bonne chose (moins de confusion), mais de toute façon, c'est le choix qui a été fait.
  • Un problème à résoudre est récursive des fonctions imbriquées, voir github.com/golang/go/issues/226

InformationsquelleAutor corazza | 2014-02-22