2017-09-17 9 views
1

Je ne sais pas comment la fonction addTwoNumbers dans l'exemple de code de terrain de jeu Swift ci-dessous peut renvoyer "(+)" en fonction du type (Int, Int) -> Int et plus tard ajouter les deux nombres ensemble par Appelez simplement "addTwoNumbers (2,2)".Pourquoi est-il possible pour une fonction Swift de renvoyer un opérateur mathématique seul?

Je n'ai pas pu trouver d'explication dans la documentation de Swift car cette solution créative semble être absente là-bas. J'ai vu les réponses de StackOverflow publier un code similaire comme réponses à d'autres questions, mais jamais expliqué pourquoi "= (+)" fonctionne. Qu'est-ce que je rate?

Veuillez noter: Je comprends que les opérateurs sont des fonctions qui sont des fonctions de première classe. Je comprends également le concept des fonctions d'ordre supérieur. J'ai raccourci l'exemple de code pour rester sur le sujet, qui est (+).

let addTwoNumbers: (Int, Int) -> Int = (+) 
print(addTwoNumbers(5,3)) //8 
+0

Simpler s'il vous plaît @Carcigenicate. Est-ce que le fait d'entourer le + entre parenthèses en fait un objet? Et donc en l'appelant avec deux arguments cela devient l'équivalent de 2 + 2? –

+0

@Carcigenicate: Un commentaire de https://math.stackexchange.com/questions/168378/operator-vs-function, indique que "tous les opérateurs sont des fonctions". Donc, quand une fonction retourne un opérateur (dans ce cas (+) qui est aussi une fonction), est-il prudent de supposer que la seule façon de l'appeler est via add (2,2) comme on l'imprimerait ("bonjour")? En d'autres termes, nous appelons la fonction + qui prend deux arguments, mais au lieu de taper + (2,2), nous devons taper add (2,2) en fonction de l'exemple de code fourni? –

+0

Mon exemple et ma question ont été adaptés au langage Swift dans le domaine de la fonction Ordre supérieur, mais votre réponse me donne une certaine direction pour mieux comprendre le concept dans n'importe quelle langue. –

Répondre

0

Dans votre exemple, rien ne retourne vraiment +, ce qu'il fait est assigner à une variable, à savoir addTwoNumbers la valeur + (opérateurs sont des fonctions et des valeurs peuvent être considérées comme des fonctions).

Le type de cette variable est (Int, Int) -> Int, c'est-à-dire une fonction de deux ints qui renvoie un int. Les fonctions sont maintenant un type spécial de variable qui peut prendre des parenthèses comme une sorte d'opérateur de suffixe, un peu comme les variables normales prend un .. Si vous écrivez le nom addTwoNumbers sans parenthèse, cela fait référence à la fonction (qui se trouve être +), mais avec eux et quelques opérandes, la fonction est appliquée, et la valeur sera celle que la fonction retourne avec ces arguments.

Notez que let addTwoNumbers: (Int, Int) -> Int = (+) est à peu près équivalente à func addTwoNumbers(_ a: Int, _ b: Int) -> Int { return a + b }