8
votes

Ruby / Rails ont-ils un équivalent de ++?

Je suppose que je viens d'être venu d'être habitué à dire des choses comme: xxx

dans PHP et Java Terre. Mais quand j'ai essayé cela dans mon code de rails, il y avait un ajustement: xxx

J'ai googlé un peu pour des opérateurs rubis / rails pour une référence à ++ mais je n'ai pas pu trouver n'importe quoi. Pour une langue qui se concentre sur l'écriture moins, je le trouve un peu étrange qu'il n'y aurait pas d'équivalent de ++. Est-ce que je manque quelque chose?


1 commentaires

x + = 1 # ..................


4 Réponses :


1
votes

0 commentaires

14
votes

Essayez ceci:

x += 1


1 commentaires

X ++ (et ++ x) sont à la fois en ligne et exécutez dans des commandes différentes de ceci. À titre d'exemple, il n'est pas possible de dupliquer cette ligne (lecture: sans le diviser) lorsque vous utilisez X + = 1: Row_top = Row_Height * Row_index ++;



5
votes

x + = 1 est le meilleur que vous puissiez faire dans Ruby.

Pour une explication détaillée, voir Pourquoi ne pas t Ruby Support I ++ ou I-- (opérateurs d'incrément / décrémentation)?


1 commentaires

Merci pour l'explication. C'est bon de savoir pourquoi je ne peux pas le faire :)



3
votes

Vraiment, vous devriez vous demander pourquoi vous avez besoin d'incrément / décrément. J'utilise Ruby depuis près de deux ans et je n'avais pas remarqué que des opérateurs d'incréments et de décréments manquaient. Peut-être parce que la façon de faire des opérations de Ruby où les opérateurs d'incrément et de décrémentation sont couramment utilisés est avec un itérateur.

tel que chacun_with_index qui exécute un bloc donné pour chaque élément / Associez une paire d'index dans le tableau. p>

Par exemple, ce code ira déterrera via un tableau de sortie de la représentation de chaîne pour chaque élément et la parité de son index. P>

array = ["first", "second", "third","fourth","last"]
array.each_with_index do |object,index|
   puts index % 2 ? "even" : "odd"
   puts object.to_s
end


9 commentaires

Mais qu'en est-il de ++ x ? (Pas que cela devrait jamais être utilisé de cette façon. Je dois mettre en pause chaque fois que je vois quelque chose comme tandis que (- x) et réfléchir à ce qu'il fait jamais être 0 dans le corps?))


Cela ne fonctionnera pas du tout. Premièrement, vous ne pouvez pas simplement définir des opérateurs arbitraires et "++" ne pas analyser à Ruby - il faudrait être appelé comme x.send ('++') . Deuxièmement, vous ne pouvez pas écrire auto = n'importe quoi. Rappelez-vous, faire x = quelque chose fait simplement le nom x Reportez-vous à un nouvel objet - il ne modifie pas la valeur de l'objet qui était auparavant.


Merci Chuck, cela me apprendra à poster du code sans le tester. Je suis sûr qu'il y a un moyen d'écrire un ++, mais sur une inspection plus étroite, cela impliquerait probablement de recomposer de rubis de C.


@EMFI, c'est un excellent point sur la quête de son utilisation d'incrémentation de variables. Chaque fois que je voulais faire quelque chose comme x + = 1 , j'ai trouvé une approche plus élégante.


Eh bien, c'est ici que j'ai juste besoin d'un comptoir simple pour me donner des numéros de rangée dans une liste d'articles que j'affiche ... S'il y a un moyen de le faire sans avoir une variable et l'incrémentation que je tiens à entendre parler de ce. J'utilise une boucle .ach.


@gshankar Essayez d'être énumérable # chacun_with_index, j'ai mis à jour ma solution pour contenir un exemple en l'utilisant ainsi qu'un lien vers sa documentation.


En changeant l'analyseur Ruby et en ajoutant un nouvel opérateur à la langue, vous vous retrouverez avec quelque chose qui n'est plus valable Ruby. (Pas que c'est nécessairement une mauvaise chose - ce n'est tout simplement pas rubis.)


L'utilisation des opérateurs d'incrément / décrémentation dans les boucles n'est pas le seul cas d'utilisation, il y en a d'autres, comme si j'étais en train de mapper une structure de données de position E.G. Colonnes CSV à une structure de données nommée, par exemple. Json, il est agréable de faire quelque chose comme Col = 0 suivi de Json = {Nom: CSV_DATA [COL ++], Description: CSV_DATA [COL ++], ONE_TOTHER_FIELD: CSV_DATA [col ++]}


@DavidCruwys: Il existe d'autres moyens d'accomplir cela sans augmenter. Col_adingings = [: Nom,: Description,: Certain_other_field] JSON = col_adings.zip (csv_data) .To_h Cela fournit également une définition singulière de vos en-têtes de colonne, de sorte que vous n'ayez pas besoin de les coder dans tous les cas où ils sont nécessaires.