Briser de longues chaînes sur plusieurs lignes dans Ruby sans supprimer les nouvelles lignes

Nous avons récemment décidé à mon travail d’un guide de style rbuy. L’un des édits est qu’aucune ligne ne doit comporter plus de 80 caractères. Comme il s’agit d’un projet Rails, nous avons souvent des chaînes un peu plus longues, c’est-à-dire que «l’utilisateur X voulait vous envoyer un message sur Thing Y» qui ne correspond pas toujours à la limite de 80 caractères.

Je comprends qu’il y a trois façons d’avoir une longue chaîne qui s’étend sur plusieurs lignes:

  • HEREDOC
  • % Q {}
  • Concaténation de chaîne réelle.

Cependant, tous ces cas finissent par prendre plus de cycles de calcul, ce qui semble idiot. Concaténation des chaînes évidemment, mais pour HEREDOC et% Q, il faut supprimer les nouvelles lignes, via quelque chose comme .gsub (/ \ n $ /, ‘).

Existe-t-il une méthode de syntaxe pure pour faire cela, ce qui équivaut à avoir toute la chaîne sur une seule ligne? Le but étant évidemment de ne pas passer de cycles supplémentaires simplement parce que je veux que mon code soit légèrement plus lisible. (Oui, je me rends compte que vous devez faire beaucoup ce compromis … mais pour la longueur de corde, cela semble 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 et la lisibilité.

Exemple:

if foo ssortingng = "this is a \ ssortingng that spans lines" end 

Je trouve que ce qui précède est un peu difficile à lire.

EDIT : J’ai ajouté une réponse ci-dessous; Trois ans plus tard, nous avons maintenant le hérédocité.

Peut-être que c’est ce que vous cherchez?

 ssortingng = "line #1"\ "line #2"\ "line #3" p ssortingng # => "line #1line #2line #3" 

Vous pouvez utiliser \ pour indiquer que toute ligne de Ruby continue sur la ligne suivante. Cela fonctionne avec des chaînes aussi:

 ssortingng = "this is a \ ssortingng that spans lines" puts ssortingng.inspect 

va sortir "this is a ssortingng that spans lines"

Trois ans plus tard, il y a maintenant une solution dans Ruby 2.3: Heredoc.

 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 pour l'article de blog: https://infinum.co/the-capsized-eight/articles/multiline-ssortingngs-ruby-2-3-0-the-squiggly-heredoc

L'indentation de la ligne la moins en retrait sera supprimée de chaque ligne du contenu.

J’ai eu ce problème quand j’essaye d’écrire une url très longue, 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=AJAKJFAFGAKAJDDAF %2Fus-east-1%2Fs3%2Faws4_request& X-Amz-Date=20170702T000940Z& X-Amz-Expires=3600&X-Amz-SignedHeaders=host& X-Amz-Signature=QEWKJRQJEWR813247812347FKFS KQWREJQ3108418324732o45o1324kldsfjasf ).join 

Notez qu’il ne doit pas y avoir de nouvelles lignes, d’espaces blancs lorsque la chaîne d’URL est formée. Si vous voulez de nouvelles lignes, utilisez alors HEREDOC.

Ici vous avez l’indentation pour la lisibilité, la facilité de modification, sans les citations et les barres obliques inverses sur chaque ligne. Le coût de l’adhésion aux chaînes doit être négligeable.

J’ai modifié la réponse de Zack car je voulais des espaces et une interpolation mais pas de nouvelles lignes et utilisé:

 %W[ It's a nice day "#{name}" for a walk! ].join(' ') 

where name = 'fred' cela produit It's a nice day "fred" for a walk!