web-dev-qa-db-fra.com

Casser de longues chaînes sur plusieurs lignes dans Ruby sans couper les nouvelles lignes

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:

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

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é.

205
chug2k

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.

34
chug2k

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

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"
393
Jessehz

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"

51
Emily

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.

16
Zack Xu

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(' ')

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

8
iheggie