143 votes

Pourquoi n ' t soutien Ruby i ++ ou i--(opérateurs d’incrémentation/décrémentation) ?

Le pré/post incrémentation/décrémentation de l'opérateur (++ et --) sont assez standard de programmation: la syntaxe de la langue (pour la procédure et les langages orientés objet, au moins).

Pourquoi ne pas Ruby? Je comprends que vous pourriez faire la même chose avec += et -=, mais il semble curieusement arbitraire d'exclure quelque chose comme ça, surtout que c'est tellement concis et conventionnelles.

Exemple:

i = 0    #=> 0
i += 1   #=> 1
i        #=> 1
i++      #=> expect 2, but as far as I can tell, 
         #=> irb ignores the second + and waits for a second number to add to i

Je comprends Fixnum est immuable, mais si += pouvez simplement instancier un nouveau Fixnum et ensemble, pourquoi ne pas faire la même chose pour ++?

Une cohérence dans les affectations contenant de l' = caractère la seule raison pour cela, ou alors j'ai loupé quelque chose?

106voto

Brian Points 4711

Voici comment Matz explique dans un ancien thread:

32voto

sepp2k Points 157757

Une des raisons sont que jusqu'à présent chaque opérateur d’assignation (c.-à-d. un opérateur qui modifie une variable) a un en elle. Si vous ajoutez et `` , qui n’est plus le cas.

Une autre raison est que le comportement de et souvent confondre les gens. Espèce : la valeur de retour de dans votre exemple serait en fait 1, pas 2 (la nouvelle valeur de serait 2, toutefois).

26voto

Chuck Points 138930

Ce n'est pas classique dans les langages à objets. En fait, il n'y a pas d' ++ en Smalltalk, la langue qui a inventé le terme "programmation orientée objet" (et le langage Ruby est plus fortement influencé par). Ce que tu veux dire, c'est que c'est classique dans C et des langages de contrefaire C. Ruby a un peu C-comme la syntaxe, mais il n'est pas servile en adhérant à C de traditions.

Quant à savoir pourquoi il n'est pas en Ruby: Matz n'en voulais pas. C'est vraiment la raison ultime.

La raison n'existe pas dans Smalltalk est parce qu'il fait partie de la langue primordial de la philosophie que l'affectation d'une variable est fondamentalement un autre genre de chose que l'envoi d'un message à un objet - c'est sur un autre niveau. Cette réflexion a probablement influé sur Matz dans la conception de Ruby.

Il ne serait pas impossible de l'inclure dans Ruby - vous pourrait facilement écrire un préprocesseur qui transforme tous ++ en +=1. mais évidemment, Il n'aimait pas l'idée d'un opérateur qui n'est "caché de cette cession." Il semble d'ailleurs un peu étrange d'avoir un opérateur avec une cachée opérande entier à l'intérieur d'elle. Aucun autre opérateur dans la langue fonctionne de cette manière.

13voto

Mladen Jablanović Points 22082

Je pense qu'il y a une autre raison: ++ en Ruby ne pas être à distance utile en C et ses successeurs directs. La raison d'être de l' for mot-clé: alors qu'il est essentiel dans C, c'est surtout superflu dans Ruby - la plupart de l'itération en Ruby, c'est fait par le biais de Énumérable méthodes, telles que l' each et map - lors d'une itération à travers certaines structures de données, et Fixnum#times méthode, lorsque vous avez besoin de boucle un nombre exact de fois. En fait, aussi loin que j'ai vu, la plupart du temps, +=1 est utilisé par des personnes fraîchement émigré à Ruby de style C langues.

En bref, c'est vraiment se demander si les méthodes d' ++ et -- serait utilisé à tous.

3voto

rogerdpack Points 12806

Je pense Matz' raisonnement pour ne pas les aimer, c'est qu'il remplace la variable par un nouveau.

ex:

a = SomeClass.nouveau
def un.aller
"bonjour"
fin
# à ce stade, vous pouvez appeler un.aller
# mais si vous avez un a++
# que cela signifie vraiment, un = un + 1
# si vous ne pouvez plus appeler un.aller
# comme vous l'avez perdu votre original

Maintenant, si quelqu'un pouvait le convaincre qu'il faut juste appeler #succ! ou ce n'est pas, qui aurait plus de sens, et d'éviter le problème. Vous pouvez suggérer sur ruby.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X