12
votes

Pourquoi y a-t-il tant de façons légèrement différentes de faire la même chose dans Ruby?

J'apprends Ruby. Mon arrière-plan est C ++ / Java / C #. Globalement, j'aime la langue, mais je suis un peu confus sur la raison pour laquelle il y a tellement de façons différentes d'accomplir la même chose, chacune avec sa propre sémantique légèrement différente.

Prenez la création de chaînes, par exemple. Je peux utiliser '', "", Q%, Q%, ou juste% pour créer des chaînes. Certaines formes soutiennent l'interpolation. D'autres formes permettent de spécifier les délimiteurs de chaîne.

Pourquoi y a-t-il cinq façons de créer des littéraux string? Pourquoi utiliserais-je des chaînes non interpolées? Quel avantage la syntaxe% a-t-elle subi des littéraux cités?

Je sais qu'il doit y avoir de la valeur dans la licenciement dans Ruby, mais mes yeux non formés ne le voient pas clairement. S'il vous plaît éclairer moi.


1 commentaires

Et 2 façons différentes de met ces chaînes. Et 4 façons différentes de définir des fonctions. Et 3 différents ...


9 Réponses :


1
votes

Beaucoup de syntaxe de Ruby est dérivé de Perl, comme en utilisant q pour citer quelques mots dans une chaîne. C'est probablement la principale raison d'une telle grande variété.


0 commentaires

3
votes

Je ne suis pas un expert rubis, mais vous avez déjà entendu le terme "sucre syntaxique"? Fondamentalement, certaines langues de programmation proposent une syntaxe différente pour accomplir la même tâche. Certaines personnes pourraient trouver un moyen plus facile que d'autres en raison de sa précédente expérience de programmation / syntaxe.


1 commentaires

En effet. Apparemment, Ruby utilise des alias / synonymes plus d'occasions. Par exemple, le nombre d'éléments dans une matrice peut être récupéré avec compteur , longueur ou taille . Mots différents pour le même attribut d'un tableau, mais par là, Ruby vous permet de choisir le mot le plus approprié pour votre code: voulez-vous le numéro Numéro d'articles que vous collectez, le Longueur d'un tableau, ou de la taille actuelle de la structure. Essentiellement, ils sont tous identiques, mais choisir le bon mot peut rendre votre code plus facile à lire, ce qui est une propriété intéressante de la langue.



2
votes

Dans la plupart des situations, vous allez finir par utiliser des délimiteurs de chaîne normaux. La différence principale entre les citations simples et doubles est que les citations doubles vous permettent d'interpoler des variables.

html = %Q{this is a <img src="#{img_path}" class="style" /> image tag}


0 commentaires

0
votes

Vous utiliseriez des chaînes non interpolées si votre chaîne contient beaucoup de caractères spéciaux (comme Backslashes, # {} etc.) et vous ne voulez pas échapper à toutes.

Vous utiliseriez différents délimiteurs si votre chaîne contient beaucoup de citations que vous devriez sinon vous échapper.

Vous utiliseriez Heredocs si vos chaînes ont beaucoup de lignes qui feraient une look de syntaxe à chaîne normale.


0 commentaires

15
votes

Pourquoi ferais-je utiliser des chaînes non interpolées?

Lorsque vous ne voulez pas l'interpolation, bien sûr. Par exemple, peut-être que vous émettez une documentation sur l'interpolation de chaîne: xxx

Quel avantage la syntaxe% a-t-elle subi des littéraux cités?

Il vous permet d'écrire des chaînes plus naturellement, sans citations, ou lorsque vous ne voulez pas échapper à beaucoup de choses, analogue au préfixe littéral de c # @ . < / p> xxx

Il existe de nombreuses autres% -NOtations: xxx

Il y a aussi % s (pour symboles) et quelques autres.

Pourquoi y a-t-il cinq façons de créer des littéraux strings?

Ce n'est pas terriblement inhabituel. Considérer c #, par exemple, qui a plusieurs façons différentes de générer des chaînes: nouvelle chaîne () ; "" ; @ "" ; stringbuilder.tostring () , et cetera.


2 commentaires

"Naturel" est très subjectif. "Terriblement inhabituel" n'est pas une motivation pour créer une caractéristique linguistique.


"Natural" est très subjectif, mais "des personnages de moins et plus facilement tapé pour dire précisément la même chose" n'est pas, et c'est une très bonne motivation pour créer une fonctionnalité de langue.



0
votes

Ruby emprunte des constructions et des idées de beaucoup de langues. Les deux influences les plus apparentes sont SmallTalk et Perl.

Selon votre confort avec SmallTalk ou Perl, vous pouvez bien choisir des constructions différentes pour faire la même chose.


0 commentaires

1
votes

Une autre raison est une performance mineure de performance pour les chaînes non interpolées. Utiliser '' vs "" signifie que Ruby n'a pas à considérer ce qui est à l'intérieur de la chaîne du tout. Donc, vous verrez des personnes utilisant des guillemets simples pour des clés ou des symboles de tableau, car ils sont plus rapides. Pour ce que ça vaut la peine, je comprendrai un peu de référence. XXX PRE>

Débit: P>

Rehearsal ------------------------------------------------
single-quote   0.610000   0.000000   0.610000 (  0.620387)
double-quote   0.630000   0.000000   0.630000 (  0.627018)
symbol         0.270000   0.000000   0.270000 (  0.309873)
--------------------------------------- total: 1.580000sec


0 commentaires

0
votes

Le long des lignes de la réponse de John: Dans des hacks rapides, je finis souvent à exécuter un Perl ou SED One-Liner avec la syntaxe Grep de mon script rubis. Être capable d'utiliser % [] type syntaxe signifie que je peux simplement copier-coller mon regexp du terminal


0 commentaires

3
votes

La question initiale est pourquoi il y a tellement de façons légèrement différentes de faire des choses dans Ruby.

Parfois, les différentes choses sont judicieuses: la citation est une bonne affaire où un comportement différent nécessite une syntaxe différente - non / interpolation, alternent des caractères de citation. , etc. - et l'accidence historique provoque des synonymes comme% x () vs `` `` `` `, autant comme dans Perl.

Le problème de synonyme - []. Longueur [] .count []. tenter d'être utile dans un monde où la langue est trop aléatoire pour les IDes pour pouvoir aider: le patch de singe et la combinaison étrange de la frappe stricte mais dynamique ensemble font des erreurs d'exécution une partie inévitable et frustrante du codage, donc les gens essaient de Réduisez le problème en fournissant des synonymes. Malheureusement, ils finissent par des programmeurs déroutants qui sont habitués à différentes méthodes faisant des choses différentes.

Le problème "si similaire mais pas tout à fait", par exemple ... xxx

... ne peut vraiment être considéré que comme une faille. Chaque langue leur a, mais elles sont généralement plus arcanes que celles-ci.

et il y a l'échec de l'utilisation arbitraire simple au lieu d'augmenter à moins que vous ne ressortez à l'exception des normes de codage Rubocop.

Il y a quelques belles morceaux dans Ruby, mais vraiment - je ferais de loin coder dans quelque chose de mieux fondé.


0 commentaires