283 votes

Découpage de longues chaînes de caractères sur plusieurs lignes en Ruby sans supprimer les retours à la ligne

Nous avons récemment décidé à mon travail d'un guide de style Ruby. L'un des édits est qu'aucune ligne ne doit dépasser 80 caractères. Comme il s'agit d'un projet Rails, nous avons souvent des chaînes de caractères un peu plus longues - par exemple " L'utilisateur X voulait vous envoyer un message à propos de la chose Y. "qui ne respecte pas toujours la limite de 80 caractères.

Je crois savoir qu'il y a trois façons de faire en sorte qu'une longue chaîne s'étende sur plusieurs lignes :

  • HEREDOC
  • %Q{}
  • Concaténation réelle de chaînes de caractères.

Cependant, tous ces cas finissent par prendre plus de cycles de calcul, ce qui semble idiot. La concaténation de chaînes de caractères, évidemment, mais pour HEREDOC et %Q Je dois enlever les nouvelles lignes, via quelque chose comme .gsub(/\n$/, '') .

Existe-t-il une manière syntaxique pure de faire cela, qui soit équivalente au fait d'avoir toute la chaîne sur une seule ligne ? Le but étant, évidemment, de ne pas dépenser de cycles supplémentaires juste parce que je veux que mon code soit légèrement plus lisible. (Oui, je me rends compte que vous devez souvent faire ce compromis... mais pour la longueur des chaînes de caractères, cela semble juste idiot).

Mise à jour : Les antislashs ne sont pas exactement ce que je veux car on perd 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 en forme de squiggly.

0 votes

Cela peut valoir la peine de tenir compte de ces ficelles.

4 votes

2 votes

Ce n'est pas clair si vous voulez garder \n caractères de nouvelle ligne ou non. La première réponse ne les conserve pas, alors que votre réponse les conserve. La question dit "sans supprimer les retours à la ligne", alors que la description dit "[...] je dois supprimer les retours à la ligne".

18voto

geoff Points 156

Il s'agit d'une très vieille question, mais comme le problème semble toujours se poser, voici une réponse actualisée. Comme l'auteur de la question initiale a indiqué qu'il s'agissait d'un projet Rails, vous pouvez vous tourner vers les inflexions des chaînes de caractères de Rails pour obtenir de l'aide.

my_long_string = <<-STRING
 hello
    there
 multiline
      multiindented string
STRING

=> " hello\n    there\n multiline\n      multiindented string\n"

Saisissez le squish méthode.

my_long_string = <<-STRING.squish
 so
    long
 multiline
      multiindented string
STRING

=> "so long multiline multiindented string"

Selon la documentation -

squish() Renvoie la chaîne de caractères, en supprimant d'abord tous les espaces blancs aux deux extrémités de la chaîne, puis en transformant les groupes d'espaces blancs consécutifs restants en un espace chacun.

0voto

Addin Cui Points 23

Vous pouvez concaténer plusieurs chaînes de caractères réparties sur plusieurs lignes :

if foo
  string = "this is a" + 
           "string that spans lines"  
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X