Existe uma maneira de fazer isso parecer um pouco melhor?
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'
Tipo, existe uma maneira de implicar concatenação?
ruby
code-formatting
Zumbis
fonte
fonte
Respostas:
Há algumas respostas para essa resposta que me ajudaram a obter o que eu precisava (concatenação fácil de várias linhas sem espaço em branco extra), mas como nenhuma das respostas reais tinha isso, estou compilando-as aqui:
Como bônus, aqui está uma versão usando a sintaxe HEREDOC engraçada (através deste link ):
O último seria principalmente para situações que exigiam mais flexibilidade no processamento. Eu pessoalmente não gosto, ele coloca o processamento em um lugar estranho, usando a string (ou seja, na frente dela, mas usando métodos de instância que geralmente vêm depois), mas está lá. Observe que, se você estiver recuando o último
END_SQL
identificador (o que é comum, já que provavelmente isso está dentro de uma função ou módulo), você precisará usar a sintaxe hifenizada (ou seja, emp <<-END_SQL
vez dep <<END_SQL
). Caso contrário, o espaço em branco recuado fará com que o identificador seja interpretado como uma continuação da sequência.Isso não economiza muita digitação, mas parece melhor do que usar sinais de + para mim.
Além disso (digo em uma edição, vários anos depois), se você estiver usando Ruby 2.3+, o operador << ~ também estará disponível , o que removerá o recuo extra da string final.
.gsub
Nesse caso, você poderá remover a chamada (embora possa depender do recuo inicial e das suas necessidades finais).EDIT: Adicionando mais um:
fonte
p <<END_SQL
deve serp <<-END_SQL
Caso contrário, esta é a resposta. opcionalmente pode retirar os espaços em branco com o operador heredoc ondulada,<<~END_SQL
<<~
à resposta seria bom, acabou pesquisando a partir daí. Pessoalmente, eu uso o<<~MSG.strip ... MSG
que também tira o último\n
.No ruby 2.0, agora você pode apenas usar
%
Por exemplo:
fonte
squish
na saída deve ser útil.Sim, se você não se importa com as novas linhas extras sendo inseridas:
Como alternativa, você pode usar um heredoc :
fonte
%Q(...)
%(...)
Existem várias sintaxes para cadeias de caracteres de várias linhas, como você já leu. O meu favorito é o estilo Perl:
A sequência de linhas múltiplas começa com% q, seguida por {, [ou (, e depois finalizada pelo caractere invertido correspondente.% Q não permite interpolação;% Q faz para que você possa escrever coisas como estas:
Na verdade, eu não tenho idéia de como esses tipos de cadeias de linhas múltiplas são chamados, então vamos chamá-los de multilinhas Perl.
Observe, no entanto, que, se você usa multilinhas Perl ou heredocs, como Mark e Peter sugeriram, você terá espaços em branco potencialmente desnecessários. Nos meus exemplos e nos exemplos deles, as linhas "de" e "onde" contêm espaços em branco à esquerda devido ao recuo no código. Se esse espaço em branco não for desejado, você deve usar seqüências de caracteres concatenadas como está fazendo agora.
fonte
%q
família incluirão as novas linhas que não são equivalentes ao código original.Às vezes, vale a pena remover novos caracteres de linha,
\n
como:fonte
Você também pode usar aspas duplas
Se necessário, para remover quebras de linha "\ n", use barra invertida "\" no final de cada linha
fonte
"" + "double quotes with some content" + ""
."x"
parece melhor e funciona mais rápido que"""x"""
(que é basicamente o mesmo que""+"x"+""
) ou"""""x"""""
(que é o mesmo que"" + "" + "x" + "" + ""
). É Ruby, não Python, onde você usa, e"""
não"
quando precisa de uma string de várias linhas.fonte
Outras opções:
fonte
<<EOM
para<<-EOM
, não?<<-EOF
exemplo. Meu palpite é que de qualquer maneira funciona.Recentemente, com os novos recursos do Ruby 2.3, o novo
squiggly HEREDOC
permitirá que você escreva nossas seqüências multilinhas de uma maneira agradável com uma alteração mínima; portanto, usando isso combinado com o.squish
(se você estiver usando trilhos) permitirá que você escreva multilinhas de uma maneira agradável! no caso de apenas usar ruby, você pode fazer um<<~SQL.split.join(" ")
que é quase o mesmoref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
fonte
<< é o operador de concatenação para seqüências de caracteres
fonte
+
é o operador de concatenação regular,<<
é o operador de acréscimo no local . O uso de efeitos colaterais em um literal funciona aqui (a primeira string é modificada duas vezes e retornada), mas IMHO é estranho e me faz dar uma olhada dupla, onde+
seria perfeitamente claro. Mas talvez eu sou apenas novo para Ruby ...frozen_string_literal
estiver ativadoSe você fazer mente espaços extras e novas linhas, você pode usar
(use% W para seqüências de caracteres interpoladas)
fonte
Para evitar fechar os parênteses para cada linha, você pode simplesmente usar aspas duplas com uma barra invertida para escapar da nova linha:
fonte
Essa sugestão tem a vantagem sobre os documentos aqui e as cadeias longas que os identificadores automáticos podem indentar cada parte da cadeia de maneira apropriada. Mas tem um custo de eficiência.
fonte
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:Se o recuo adequado não for uma preocupação, as aspas simples e duplas podem abranger várias linhas no Ruby:
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: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):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: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: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:
A interpolação pode ser desativada se o terminador EOS estiver entre aspas simples:
Uma restrição importante do
<<HEREDOC
é que o terminador End of String precisa estar no início da linha: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:Desde o Ruby 2.3, agora temos o HEREDOC que
<<~
remove os espaços em branco principais:Linhas vazias e linhas que contêm apenas tabulações e espaço são ignoradas por << ~
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.
O HEREDOC pode fazer coisas malucas, como executar comandos usando backticks:
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):
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:Se você não possui o Ruby 2.3, mas o Rails
>=
3.0, pode usar oString.strip_heredoc
que faz o mesmo que<<~
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:
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.
fonte
Resposta elegante hoje:
Há uma diferença em
<<-TEXT
e<<~TEXT
, o primeiro mantém o espaçamento dentro do bloco e o último não.Existem outras opções também. Como concatenação, etc., mas essa faz mais sentido em geral.
Se eu estiver errado aqui, deixe-me saber como ...
fonte
Como você, eu também estava procurando uma solução que não inclua novas linhas . (Embora eles possam estar seguros no SQL, eles não estão seguros no meu caso e eu tenho um grande bloco de texto para lidar)
É indiscutivelmente tão feio, mas você pode fazer uma barra invertida de escape com novas linhas em um heredoc para omiti-las da sequência resultante:
Observe que você não pode fazer isso sem interpolação (IE
<<~'END_OF_INPUT'
), portanto, tenha cuidado.#{expressions}
serão avaliados aqui, enquanto eles não aparecerão no seu código original. R. A resposta de Wilson pode ser melhor por esse motivo.fonte