Backslashs dans les chaînes à guillemets simples par rapport aux chaînes à guillemets doubles
si j'ajoute un antislash+espace au début des chaînes double et simple citées, j'obtiens des résultats différents:
" text"
' text'
dans la sortie pour la double chaîne de caractères, Je ne vois qu'un espace.
Dans la sortie pour la seule chaîne Citée, je vois backslash+space.
que se passe-t-il? Est-ce parce que ' '
est interprété comme un caractère spécial dans la chaîne de citation double mais dans la chaîne de citation simple le les caractères sont conservés que c'est?
si je change les chaînes de caractères en ceci, je vois la même sortie, à savoir une barre oblique simple suivie d'un espace et puis le texte:
" text"
' text'
dans les deux cas, le revers est échappé. Je ne comprends pas pourquoi ils fonctionnent de la même façon dans cette situation.
y a-t-il une règle qui pourrait aider à expliquer la différence fondamentale entre la façon dont les chaînes simples et doubles traitent les backslashs à Ruby?
6 réponses
je vous référerais à " Ruby Programming/Strings " pour un aperçu très concis mais complet des différences.
de la référence:
puts "Betty's pie shop"
puts 'Betty\'s pie shop'
parce que "Betty" contient une apostrophe, qui est le même caractère que la simple citation, dans la deuxième ligne nous avons besoin d'utiliser un antislash pour échapper à l'apostrophe ainsi que Ruby comprenne que l'apostrophe est dans la chaîne littérale au lieu de marquer la fin de la chaîne littérale. La barre oblique suivie par l'apostrophe est appelé une séquence d'échappement.
les cordes à double guillemets supportent toute la gamme des séquences d'échappement, comme indiqué ci-dessous:
-
\a
Bell/alert (0x07) -
\b
Backspace (0x08) -
\e
Escape (0x1b) -
\f
Formford (0x0c) -
\n
retour à la ligne (0x0a) -
\r
Retour (0x0d) -
\s
L'espace (0x20) -
\t
Onglet (0x09) -
\v
tabulation Verticale (0x0b)
pour les chaînes à simple guillemet, deux antislashs consécutifs sont remplacés par un antislash simple, et un antislash suivi d'un guillemet devient un guillemet simple:
'escape using "\"' -> escape using "\"
'That\'s right' -> That's right
Ruby n'interprète des séquences d'évasion que dans des cordes à double citation. Dans une seule chaîne de citation, seuls \
(backslash backslash) et \'
(backslash quote) sont considérés comme des caractères spéciaux. Vous devez utiliser des chaînes entre guillemets doubles uniquement lorsque vous avez besoin de plus d'interprétation. Dans le cas contraire, des soumissions uniques donnent un coup de pouce aux performances.
quand vous avez mentionné y compris le nom d'une variable, Ruby ne fait jamais cela. Juste le nom de la variable est traité comme plus de un littéral de chaîne. Pour inclure la valeur d'une variable (ou toute expression) mettez l'expression comme ceci:
"#{variable}"
notez que cela ne fonctionne que dans les cordes à double guillemet. Pour ajouter une variable à une seule Citée, vous devez faire ceci:
'The value of X is: '+X
si vous avez besoin de formatage sérieux, regardez dans la version de Ruby de sprintf et printf. Ils sont assez enveloppants autour des fonctions C, et sont assez puissants, mais un peu encombrants à utiliser.
il ne s'agit pas d'une réponse complète (puisque la simple question a déjà été répondue), mais plutôt d'informations supplémentaires.
quel style de corde de rubis Citez-vous?
N'utilisez pas de guillemets si vous devez leur échapper. Et de ne pas tomber dans "unique vs double guillemets " trap. Ruby a excellente prise en charge de l'arbitraire délimiteurs pour la littérature à cordes:
j'ai suivi ce conseil et je n'ai jamais regardé en arrière!
Est-ce parce que le '\ ' est interprété comme un caractère spécial dans la double chaîne de citation mais dans le seul cité chaîne de caractères sont conservés que c'est?
Oui. Les cordes à guillemet simple sont traitées comme littérales; les cordes à guillemet double sont interpolées. C'est la même chose dans d'autres langues de type Rubis, et n'a pas changé en 1.9.
vous pouvez faire <%= f.label :nom_entreprise, "Nom de l'entreprise" %>