Appel Proc #
Par exemple, considérons les fonctions «add» et «sum» qui produisent la somme de deux arguments. Avec Python et JavaScript, vous pouvez écrire du code comme celui-ci:
python
def add(x, y):
print(x + y)
sum = add #Peut être remplacé tel quel
add(1, 2)
sum(1, 2) #Il n'y a aucune différence dans la façon d'appeler add et sum
JavaScript
function add(x, y){
console.log(x + y);
}
sum = add //Peut être remplacé tel quel
add(1, 2)
sum(1, 2) //Il n'y a aucune différence dans la façon d'appeler add et sum
Cependant, dans Ruby, il n'est pas possible d'assigner une méthode à une autre variable telle quelle, vous devez créer un objet Proc
avec proc
ou lambda
puis le transmettre, et le destinataire passe également l'appel
. Vous devez l'appeler. C'est également le cas autour de Java où vous devez appeler la méthode ʻapply`.
Ruby
def add(x, y)
puts (x + y)
end
sum = proc{|x, y| add(x, y)} #Besoin d'envelopper dans proc ou lambda
add 1, 2
sum.call 1, 2 #Il est nécessaire d'appeler avec call, et l'utilisation de add et sum est différente.
Je vois, ce n'est pas bon. Cependant, il existe un contre-argument du côté Ruby, et Ruby a l'avantage que les parenthèses peuvent être omises dans les appels de méthode lorsqu'il n'y a pas d'arguments.
JavaScript
function answer(){
console.log(42)
}
answer() //Il y a des parenthèses
Ruby
def answer
puts 42
end
answer #Je n'ai pas besoin de parenthèses
Je le trouve aussi un peu maladroit et difficile à gérer. Mais, comme le dit le texte, il s'agit d'un compromis avec le style unique qui ajoute de la valeur à Ruby.
Tenter d'introduire de telles abréviations dans JavaScript ou Python n'est pas possible car cela entre en conflit avec la syntaxe qui représente l'objet fonction lui-même. C'est pourquoi, d'après ce que je peux voir, il ne semble pas que je puisse dire lequel est le meilleur ...
Haskell / PureScript résout ce dilemme.
PureScript
add x y = logShow (x + y) --add a un argument
sum = add --Les fonctions sont de première classe, vous pouvez donc les attribuer normalement
answer = logShow 42 --la réponse n'a pas d'arguments
fortyTwo = answer --Puisque la valeur de réponse est également de première classe, vous pouvez l'affecter à une autre variable telle quelle.
main = do
add 1 2 --3 est émis. Bien sûr, vous pouvez l'appeler normalement s'il y a un argument
sum 1 2 --3 est émis. Il n'y a aucune différence dans la façon d'appeler add et sum
answer --42 est émis. Bien sûr, il n'y a pas de parenthèses même s'il n'y a pas d'arguments
fortyTwo --42 est émis. Parce que quarante-deux et réponse se réfèrent à la même chose.
Il y a deux avantages: "L'appel de fonction sans argument de Ruby peut omettre les parenthèses" et "l'appel de fonction normal et l'appel d'objet de fonction de Python / JavaScript ne sont pas distingués". Mystérieux! Il peut être intéressant de penser par vous-même pourquoi Haskell / PureScript peut faire cela, ce que signifie chaque partie du code ci-dessus, et dans quel ordre l'exécution se déroule [^ sample].
[^ sample]: Cependant, je ne pense pas que quiconque ne connaisse pas Haskell / PureScript le saura. Puisqu'il s'agit de code PureScript, la spécification de transformation unique de Haskell "évaluation du délai" qui perturbe l'ordre d'exécution n'est pas pertinente.
De plus, si vous regardez attentivement le code PureScript ci-dessus, il n'y a pas de points, pas de deux-points et même une virgule. Le seul mot réservé est «do», qui signale le début du bloc de code. Vous pouvez voir que le code a l'air étrangement rafraîchissant, comme le bloc représenté par une indentation comme Python. C'est également une fonctionnalité du code Haskell / PureScript. Le bruit syntaxique est réduit à la limite et je pense qu'il est très facile à lire, mais pour une raison quelconque, on dit parfois qu'il est difficile à lire.
C'est un problème de grammaire, alors peut-être qu'une langue avec une grammaire qui les équilibre sera développée à l'avenir.
Il existe depuis plus de 15 ans. Ce n'est pas très connu car il y a trop peu de personnes qui l'utilisent ...
De nombreux utilisateurs de Ruby peuvent ne pas aimer une telle surcharge syntaxique, comme essayer d'omettre les parenthèses lorsqu'il n'y a pas d'arguments. Haskell / PureScript a une syntaxe simple, donc je pense qu'elle convient aux personnes qui aiment Ruby. Je ne me soucie pas vraiment de ces détails, mais je pense généralement qu'il est pratique d'abstraire des actions synchrones et asynchrones avec des monades par souci de cohérence. Pour expliquer les avantages de ceci, «je ne sais pas ce que cela signifie. Cette fois, j'ai expliqué aussi brièvement que possible le point facile à comprendre que «la commodité et la simplicité sont compatibles avec la présence ou l'absence d'arguments de fonction et s'ils sont de première classe».