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. P>
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. P>
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? P>
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. P>
9 Réponses :
Beaucoup de syntaxe de Ruby est dérivé de Perl, comme en utilisant q code> pour citer quelques mots dans une chaîne. C'est probablement la principale raison d'une telle grande variété. p>
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. p>
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 code>, longueur code> ou taille code>. 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 i> d'articles que vous collectez, le Longueur I> d'un tableau, ou de la taille actuelle i> 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.
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}
Vous utiliseriez des chaînes non interpolées si votre chaîne contient beaucoup de caractères spéciaux (comme Backslashes, Vous utiliseriez différents délimiteurs si votre chaîne contient beaucoup de citations que vous devriez sinon vous échapper. P>
Vous utiliseriez Heredocs si vos chaînes ont beaucoup de lignes qui feraient une look de syntaxe à chaîne normale. P> # {} code> etc.) et vous ne voulez pas échapper à toutes. p>
Pourquoi ferais-je utiliser des chaînes non interpolées? P>
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: p>
xxx pré> Quel avantage la syntaxe% a-t-elle subi des littéraux cités? P> BlockQuote>
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 #
@ code>. < / p>xxx pré> Il existe de nombreuses autres% -NOtations: p>
xxx pré> Il y a aussi
% s code> (pour symboles) et quelques autres. p>Pourquoi y a-t-il cinq façons de créer des littéraux strings? p> BlockQuote>
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 () code>;"" code>;@ "" code>;stringbuilder.tostring () code>, et cetera. p> blockquote>
"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.
Ruby emprunte des constructions et des idées de beaucoup de langues. Les deux influences les plus apparentes sont SmallTalk et Perl. P>
Selon votre confort avec SmallTalk ou Perl, vous pouvez bien choisir des constructions différentes pour faire la même chose. P>
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. 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
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 % [] code> type syntaxe signifie que je peux simplement copier-coller mon regexp du terminal P>
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. p>
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. P>
Le problème "si similaire mais pas tout à fait", par exemple ... p> ... 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. P> 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. P> Il y a quelques belles morceaux dans Ruby, mais vraiment - je ferais de loin coder dans quelque chose de mieux fondé. p> p>
Et 2 façons différentes de
met code> ces chaînes. Et 4 façons différentes de définir des fonctions. Et 3 différents ...