Usando Heredoc em Ruby

Dicas - 05/Ago/2019 - por Henrique Morato

Você já teve que escrever linhas longas de código tentando manter a indentação e parece que Ruby não tem uma solução para strings em multiline, certo? Seus problemas acabaram!

expect(current_page).to have_content('exemplo de texto que poderia '\
                                     'melhorar')

Bom, para isso servem as heredocs ou here-document, uma forma de escrever texto que pode ser tratada como algo separado do seu código. Vamos começar vendo alguns exemplos:

text = <<HEREDOC
  Mas no final é só uma coisa passageira, essa sombra. 
  Mesmo a escuridão deve passar.
HEREDOC

# => "  Mas no final é só uma coisa passageira, essa sombra. \n  Mesmo a escuridão deve passar.\n"

Esse seria o uso mais simples de heredoc, onde mantemos as quebras de linha e a organização do texto. Se quisermos remover esses espaços precisaremos tratar ou remover na indentação do código.

O problema do uso somente com << é que a palavra final deve estar no começo da linha.

def lord_of_the_rings
  <<HEREDOC
    Mas no final é só uma coisa passageira, essa sombra. 
    Mesmo a escuridão deve passar.
HEREDOC
end

Dica: Estamos usando a notação HEREDOC, mas na verdade podemos usar qualquer texto para substituir essa notação. A parte importante é que seja um texto que não aparece na string escrita entre as notações.

Para melhorar, em Ruby temos uma forma mais adequada de fazer isso usando a notação <<-.

def find_shire
  <<-SQL
    SELECT * FROM land
    WHERE name = 'Shire'
  SQL
end

find_shire
#  => "    SELECT * FROM land\n    WHERE name = 'Shire'\n"

Escrito dessa forma podemos indentar o término juntamente com o nosso código, algo similar ao %q() ou %Q().

Dica: Com Heredocs também podemos usar a notação #{código ruby} para interpolar strings. Você pode desabilitar essa opção definindo a Heredoc entre aspas: <<-'SQL'.

Com o Ruby 2.3 foi introduzida mais uma notação que soluciona grande parte dos nossos problemas que é a Squiggly Heredoc. Com ela, podemos desconsiderar a indentação do texto o que nos ajuda muito a organizar o nosso código.

def lord_of_the_rings
  <<~HEREDOC
    Mas no final é só uma coisa passageira, essa sombra. 
    Mesmo a escuridão deve passar.
  HEREDOC
end

 lord_of_the_rings
 # => "Mas no final é só uma coisa passageira, essa sombra. \nMesmo a escuridão deve passar.\n"

def other_quote
  <<~HEREDOC.strip
    Você pode encontrar as coisas que perdeu, 
    mas nunca as que abandonou.
  HEREDOC
end

# => "Você pode encontrar as coisas que perdeu, \nmas nunca as que abandonou."

A documentação do Ruby é bem completa, com outros exemplos de como usar Here Document, então, se quiser continuar a leitura, o link está aqui nas referências.

Referências