O caminho do Ruby (TM) desde o Ruby 2.3: use o HEREDOC ondulado <<~
para definir uma sequência de linhas múltiplas com novas linhas e recuo adequado:
conn.exec <<~EOS
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where etc etc etc etc etc etc etc etc etc etc etc etc etc
EOS
# -> "select...\nfrom...\nwhere..."
Se o recuo adequado não for uma preocupação, as aspas simples e duplas podem abranger várias linhas no Ruby:
conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc"
# -> "select...\n from...\n where..."
Se aspas simples ou duplas são complicadas porque isso exigiria muito escape, a notação literal da string de porcentagem %
é a solução mais flexível:
conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n from...\n where..."
Se o objetivo é evitar as novas linhas (causadas por HEREDOC, aspas e literal de seqüência de caracteres percentual), uma continuação de linha pode ser usada colocando uma barra invertida \
como o último caractere que não é um espaço em branco em uma linha. Isso continuará a linha e fará com que Ruby concatene as Strings consecutivas (cuidado com os espaços dentro da string citada):
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' \
'from table1, table2, table3, etc, etc, etc, etc, etc, ' \
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
# -> "select...from...where..."
Se você usar o Rails String.squish
, a seqüência de espaços à esquerda e à direita será reduzida e reduzirá todos os espaços em branco consecutivos (novas linhas, guias e tudo) em um único espaço:
conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc".squish
# -> "select...attr7 from...etc, where..."
Mais detalhes:
Sintaxe Ruby HEREDOC
A notação de documento aqui para seqüências de caracteres funciona é uma maneira de designar longos blocos de texto embutidos no código. É iniciado <<
seguido por uma String definida pelo usuário (o terminador End of String). Todas as linhas a seguir são concatenadas até o final do final da string ser encontrado no início de uma linha:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
O terminador End of String pode ser escolhido livremente, mas é comum usar algo como "EOS" (End of String) ou algo que corresponda ao domínio da String, como "SQL".
O HEREDOC suporta interpolação por padrão ou quando o terminador EOS é duplo entre aspas:
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
A interpolação pode ser desativada se o terminador EOS estiver entre aspas simples:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
Uma restrição importante do <<HEREDOC
é que o terminador End of String precisa estar no início da linha:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
Para contornar isso, a <<-
sintaxe foi criada. Ele permite que o terminador EOS seja recuado para tornar o código mais agradável. As linhas entre o <<-
terminador EOS ainda são usadas em toda a extensão, incluindo todo o recuo:
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
Desde o Ruby 2.3, agora temos o HEREDOC que <<~
remove os espaços em branco principais:
puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
def foo
print "foo"
end
EOS
# -> "def foo\n..print "foo"\nend"
Linhas vazias e linhas que contêm apenas tabulações e espaço são ignoradas por << ~
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
Se forem usadas guias e espaços, as guias serão consideradas iguais a 8 espaços. Se a linha menos recuada estiver no meio de uma guia, essa guia não será removida.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
O HEREDOC pode fazer coisas malucas, como executar comandos usando backticks:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
As definições de string HEREDOC podem ser "empilhadas", o que significa que o primeiro terminador EOS (EOSFOO abaixo) encerrará a primeira string e iniciará o segundo (EOSBAR abaixo):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
Eu não acho que alguém possa usá-lo como tal, mas o <<EOS
é realmente apenas uma string literal e pode ser colocada onde quer que uma string possa ser normalmente colocada:
def func(a,b,c)
puts a
puts b
puts c
end
func(<<THIS, 23, <<THAT)
Here's a line
or two.
THIS
and here's another.
THAT
Se você não possui o Ruby 2.3, mas o Rails >=
3.0, pode usar o String.strip_heredoc
que faz o mesmo que<<~
# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
def strip_heredoc
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
end
end
puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
This command does such and such.
Supported options are:
-h This message
...
USAGE
Literais de seqüência de caracteres percentuais
Veja RubyDoc para saber como usar o sinal de porcentagem seguido por uma corda em um parênteses emparelhar tais como %(...)
, %[...]
, %{...}
, etc. ou um par de qualquer caractere não-alfanumérico, como%+...+
Últimas palavras
Por fim, para obter a resposta para a pergunta original "Existe uma maneira de implicar concatenação?" respondeu: Ruby sempre implica concatenação se duas strings (simples e dupla entre aspas) forem encontradas consecutivas:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
A ressalva é que isso não funciona entre quebras de linha, porque Ruby está interpretando um final de declaração e a consequente linha de apenas strings em uma linha não faz nada.