Nous avons récemment décidé, dans mon travail, de choisir un Ruby style. L'un des édits est qu'aucune ligne ne doit être plus large que 80 caractères. Comme il s’agit d’un projet Rails, nous avons souvent des chaînes un peu plus longues, c’est-à-dire "l’utilisateur X voulait vous envoyer un message à propos de Thing Y" qui ne se résume pas toujours tenir dans la limite de 80 caractères.
Je comprends qu’il existe trois manières d’avoir une longue chaîne de caractères sur plusieurs lignes:
Cependant, tous ces cas finissent par prendre plus de cycles de calcul, ce qui semble idiot. La concaténation de chaînes évidemment, mais pour HEREDOC
et %Q
, je dois supprimer les nouvelles lignes, via quelque chose comme .gsub(/\n$/, '')
.
Existe-t-il un moyen purement syntaxique de faire cela, qui équivaut à avoir la chaîne entière sur une ligne? Le but étant, évidemment, de ne pas passer de cycle supplémentaire simplement parce que je veux que mon code soit légèrement plus lisible. (Oui, je me rends compte que vous devez faire ce compromis beaucoup ... mais pour la longueur de la corde, cela semble juste idiot.)
Mise à jour: les barres obliques inverses ne sont pas exactement ce que je veux, car vous perdez l'indentation, ce qui affecte vraiment le style/la lisibilité.
Exemple:
if foo
string = "this is a \
string that spans lines"
end
Je trouve ce qui précède un peu difficile à lire.
EDIT: J'ai ajouté une réponse ci-dessous; Trois ans plus tard, nous avons maintenant l'heredoc ondulé.
Trois ans plus tard, il y a maintenant une solution dans Ruby 2.3: L'hérédoc onduleux.
class Subscription
def warning_message
<<~HEREDOC
Subscription expiring soon!
Your free trial will expire in #{days_until_expiration} days.
Please update your billing information.
HEREDOC
end
end
Lien vers un article de blog: https://infinum.co/the-capsized-eight/articles/multiline-strings-Ruby-2-3-0-the-squiggly-heredoc
L'indentation de la ligne la moins marquée est supprimée de chaque ligne du contenu.
Peut-être que c'est ce que vous cherchez?
string = "line #1"\
"line #2"\
"line #3"
p string # => "line #1line #2line #3"
Vous pouvez utiliser \
pour indiquer que toute ligne de Ruby continue à la ligne suivante. Cela fonctionne aussi avec les chaînes:
string = "this is a \
string that spans lines"
puts string.inspect
va sortir "this is a string that spans lines"
J'ai eu ce problème lorsque j'essaie d'écrire une très longue URL, les travaux suivants.
image_url = %w(
http://minio.127.0.0.1.xip.io:9000/
bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
28ed3774-b234-4de2-9a11-7d657707f79c?
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=ABABABABABABABABA
%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20170702T000940Z&
X-Amz-Expires=3600&X-Amz-SignedHeaders=Host&
X-Amz-Signature=ABABABABABABABABABABAB
ABABABABABABABABABABABABABABABABABABA
).join
Notez qu'il ne doit y avoir aucune nouvelle ligne ni espace blanc lorsque la chaîne d'URL est formée. Si vous voulez des nouvelles lignes, utilisez HEREDOC.
Ici, vous avez l'indentation pour la lisibilité, la facilité de modification, sans les guillemets fastidieux et les barres obliques inverses sur chaque ligne. Le coût pour joindre les cordes devrait être négligeable.
J'ai modifié la réponse de Zack depuis I espaces recherchés et interpolation mais pas de nouvelle ligne et utilisé:
%W[
It's a Nice day "#{name}"
for a walk!
].join(' ')
où name = 'fred'
cela produit It's a Nice day "fred" for a walk!