답변:
이 답변에는 내가 필요로하는 것을 얻는 데 도움이되는 조각이 있습니다 (추가 공백없이 쉬운 여러 줄 연결). 그러나 실제 답변이 없었기 때문에 여기에서 컴파일하고 있습니다.
str = 'this is a multi-line string'\
' using implicit concatenation'\
' to prevent spare \n\'s'
=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"
보너스로 재미있는 HEREDOC 구문을 사용하는 버전 이 있습니다 ( 이 링크 를 통해 ).
p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM users
ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"
후자는 대부분 처리에 더 많은 유연성이 필요한 상황에 적합합니다. 나는 개인적으로 그것을 좋아하지 않습니다. 문자열이 이상한 장소에 처리를합니다 (즉, 그 앞에 있지만 보통 이후에 오는 인스턴스 메소드를 사용합니다). 마지막 END_SQL
식별자를 들여 쓰는 경우 (일반적으로 함수 또는 모듈에있을 수 있으므로) 하이픈이있는 구문 (즉, p <<-END_SQL
대신 p <<END_SQL
) 을 사용해야합니다 . 그렇지 않으면 들여 쓰기 공백으로 인해 식별자가 문자열의 연속으로 해석됩니다.
이것은 많은 타이핑을 저장하지는 않지만 + 기호를 사용하는 것보다 나아 보입니다.
또한 (몇 년 후 편집에서 말합니다) Ruby 2.3 이상을 사용하는 경우 << ~ 연산자 도 사용할 수 있으며 최종 문자열에서 들여 쓰기가 추가로 제거됩니다. .gsub
이 경우 호출 을 제거 할 수 있어야합니다 (시작 들여 쓰기 및 최종 요구에 따라 다를 수 있음).
편집 : 하나 더 추가 :
p %{
SELECT * FROM users
ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"
p <<END_SQL
해야한다 p <<-END_SQL
그렇지 않으면이는 대답이다. 선택적으로 구불 구불 한 HEREDOC 연산자를 사용하여 선행 공백을 제거 할 수 있습니다.<<~END_SQL
<<~
답변에 추가하면 좋을 것입니다. 개인적으로, 나는 <<~MSG.strip ... MSG
또한 마지막을 제거합니다 \n
.
루비 2.0에서는 이제 사용할 수 있습니다 %
예를 들면 다음과 같습니다.
SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}
squish
출력에 도움이됩니다.
예, 추가 줄 바꿈이 마음에 들지 않으면 :
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'
또는 heredoc을 사용할 수 있습니다 .
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
%Q(...)
%(...)
이미 읽은 것처럼 여러 줄 문자열에 대한 여러 구문이 있습니다. 내가 가장 좋아하는 것은 Perl 스타일입니다.
conn.exec %q{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}
여러 줄로 된 문자열은 % q로 시작하고 그 뒤에 {, [또는 (가 들어간 뒤에 해당하는 반전 문자로 종료됩니다. % q는 보간을 허용하지 않습니다. % Q는 다음과 같이 쓸 수 있습니다.
conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from #{table_names},
where etc etc etc etc etc etc etc etc etc etc etc etc etc}
실제로 이러한 종류의 여러 줄 문자열이 어떻게 호출되는지 전혀 알지 못하므로 Perl 여러 줄이라고 부르겠습니다.
그러나 Mark와 Peter가 제안한대로 Perl multiline 또는 heredocs를 사용하든 잠재적으로 불필요한 공백이 생길 수 있습니다. 필자의 예제와 예제에서 "from"및 "where"줄에는 코드에서 들여 쓰기로 인해 선행 공백이 포함됩니다. 이 공백이 바람직하지 않은 경우 지금하는 것처럼 연결된 문자열을 사용해야합니다.
%q
패밀리 에서 생성 된 문자열 은 원래 코드와 동일하지 않은 개행을 포함합니다.
큰 따옴표를 사용할 수도 있습니다
x = """
this is
a multiline
string
"""
2.3.3 :012 > x
=> "\nthis is\na multiline\nstring\n"
줄 바꿈 "\ n"을 제거해야하는 경우 각 줄 끝에 백 슬래시 "\"를 사용하십시오.
"" + "double quotes with some content" + ""
.
"x"
보다 """x"""
기본적으로 같은 ""+"x"+""
) 또는 """""x"""""
( 와 같은 ) 보다 더 잘 보이고 더 빨리 작동 한다는 것을 의미합니다 "" + "" + "x" + "" + ""
. 여러 줄 문자열이 필요할 때 """
대신 사용 하는 Python이 아닌 Ruby "
입니다.
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
다른 옵션:
#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM
puts multiline_string
#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF
puts message
<<EOM
에 <<-EOM
더?
<<-EOF
예 에서 효과가있는 것처럼 보였습니다 . 내 생각 엔 어느 쪽이든 작동합니다.
최근 Ruby 2.3의 새로운 기능을 squiggly HEREDOC
사용하면 최소한의 변경으로 여러 줄 문자열을 멋진 방식으로 작성할 수 있으므로 .squish
(레일을 사용하는 경우)이 줄을 사용하면 여러 줄을 멋진 방식으로 작성할 수 있습니다! 루비를 사용 <<~SQL.split.join(" ")
하는 경우 거의 동일한 작업을 수행 할 수 있습니다
[1] pry(main)> <<~SQL.squish
[1] pry(main)* select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)* from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)* where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "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"
심판 : https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
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'
<<는 문자열의 연결 연산자입니다
+
일반 연결 연산자이다 <<
는 IS 현재 위치에서 APPEND 연산자. 리터럴에 부작용을 사용하면 여기에서 작동하지만 (첫 번째 문자열은 두 번 수정되어 반환됩니다) IMHO 그것은 이상하고 이중 복용을 +
할 수있게 해줍니다. 하지만 어쩌면 나는 ... 루비에 단지 새로운이야
frozen_string_literal
활성화 하면 작동하지 않습니다
당신이 경우에 할 마음 여분의 공백과 줄 바꿈을, 당신은 사용할 수 있습니다
conn.exec %w{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} * ' '
(보간 된 문자열에 % W 사용)
conn.exec [
"select attr1, attr2, attr3, ...",
"from table1, table2, table3, ...",
"where ..."
].join(' ')
이 제안은 자동 들여 쓰기가 문자열의 각 부분을 적절하게 들여 쓸 수있는 여기 문서 및 긴 문자열보다 이점이 있습니다. 그러나 효율성 비용이 발생합니다.
Ruby 2.3 이후의 Ruby-way (TM) : 줄 바꿈과 적절한 식별로 여러 줄 문자열을 정의하려면 구불 구불 한 HEREDOC를 사용하십시오 <<~
.
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..."
적절한 식별이 중요하지 않은 경우 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..."
작은 따옴표 나 큰 따옴표가 많은 이스케이프가 필요하기 때문에 번거로울 경우 퍼센트 문자열 리터럴 표기법 %
이 가장 유연한 솔루션입니다.
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..."
줄 바꿈을 피하는 것이 목표라면 (뒤틀린 HEREDOC, 따옴표 및 퍼센트 문자열 리터럴로 인해 발생할 것입니다), 공백이 아닌 마지막 문자가 줄을 계속 유지하므로 루비가 문자열을 다시 연결합니다. (인용 문자열 안에있는 공백에주의하십시오) :
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..."
Rails를 사용하면 String.squish
선행 및 후행 문자열을 제거하고 연속 된 모든 공백 (줄 바꿈, 탭 및 모두)을 단일 공간으로 축소합니다.
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...from...where..."
자세한 내용은:
Here Document Notation for Strings 작품은 코드에서 긴 텍스트 블록을 인라인으로 지정하는 방법입니다. 그 <<
다음에 사용자 정의 문자열 (문자열 끝 종결 자)이옵니다. 문자열 터미네이터의 끝은에 발견 될 때까지 모든 다음 줄이 연결됩니다 매우 시작 라인의 :
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
문자열 끝 종결자는 자유롭게 선택할 수 있지만 "EOS"(문자열 끝)와 같은 것 또는 "SQL"과 같은 문자열의 도메인과 일치하는 것을 사용하는 것이 일반적입니다.
HEREDOC는 기본적으로 또는 EOS 종료자가 큰 따옴표로 묶인 경우 보간 을 지원합니다 .
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
EOS 터미네이터가 작은 따옴표로 묶인 경우 보간을 비활성화 할 수 있습니다.
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
의 한 가지 중요한 제한 사항은 <<HEREDOC
문자열 끝 종결자가 줄의 시작 부분에 있어야한다는 것입니다.
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
이 문제를 해결하기 위해 <<-
구문이 작성되었습니다. EOS 터미네이터를 들여 들여 코드를 더 멋지게 보이게 할 수 있습니다. <<-
EOS 터미네이터 사이의 줄 은 여전히 모든 들여 쓰기를 포함하여 완전히 확장되어 사용됩니다.
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
Ruby 2.3부터는 HEREDOC이 뒤 따르는 <<~
공백을 제거했습니다.
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"
탭과 공백 만 포함 된 빈 줄과 줄은 << ~에서 무시됩니다.
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
탭과 공백이 모두 사용되는 경우 탭은 8 개의 공백과 같은 것으로 간주됩니다. 들여 쓰기가 가장 적은 줄이 탭 가운데 있으면이 탭은 제거되지 않습니다.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC은 백틱을 사용하여 명령을 실행하는 것과 같은 미친 일을 할 수 있습니다.
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
HEREDOC 문자열 정의는 "스택"될 수 있습니다. 즉, 첫 번째 EOS 터미네이터 (아래 EOSFOO)는 첫 번째 문자열을 종료하고 두 번째 문자열 (아래 EOSBAR)을 시작합니다.
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
나는 아무도 그것을 그렇게 사용하지 않을 것이라고 생각하지만, <<EOS
실제로는 문자열 리터럴이며 일반적으로 문자열을 넣을 수있는 곳에 넣을 수 있습니다.
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
Ruby 2.3이 없지만 Rails >=
3.0 이 있다면 다음 String.strip_heredoc
과 같은 기능을 사용할 수 있습니다<<~
# 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
퍼센트 기호와 ,, 등의 괄호 쌍으로 문자열을 사용하는 방법에 대해서는 RubyDoc 을 참조하십시오 .%(...)
%[...]
%{...}
등 또는 영숫자가 아닌 문자 한 쌍의 등을%+...+
마지막으로 원래 질문에 대한 답을 얻으려면 "연결을 암시하는 방법이 있습니까?" 답변 : 루비는 두 개의 문자열 (단일 및 큰 따옴표)이 연속적으로 발견되면 항상 연결을 암시합니다.
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
루비가 문장의 끝을 해석하고 결과 라인 만 문자열의 행만으로는 아무 것도하지 않기 때문에 이것은 줄 바꿈에서 작동하지 않는다는 점에주의해야합니다.
<<~TEXT
Hi #{user.name},
Thanks for raising the flag, we're always happy to help you.
Your issue will be resolved within 2 hours.
Please be patient!
Thanks again,
Team #{user.organization.name}
TEXT
<<-TEXT
와 차이가 있습니다<<~TEXT
전자는 블록 내부의 간격을 유지하지만 후자는 그렇지 않습니다.
다른 옵션도 있습니다. 연결 등과 같지만 일반적으로 더 의미가 있습니다.
내가 틀렸다면 어떻게하는지 알려주십시오.
당신처럼, 나는 또한 개행을 포함하지 않는 해결책을 찾고있었습니다 . (SQL에서 안전 할 수는 있지만 제 경우에는 안전하지 않으며 처리 할 큰 텍스트 블록이 있습니다)
이것은 추악한 것 같지만 heredoc에서 줄 바꿈을 이스케이프 처리하여 결과 문자열에서 생략 할 수 있습니다.
conn.exec <<~END_OF_INPUT
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
END_OF_INPUT
보간 (IE <<~'END_OF_INPUT'
) 없이는이 문제를 해결할 수 없으므로 주의하십시오. #{expressions}
원래 코드에는없는 반면 여기에서 평가됩니다. A. 윌슨의 대답 은 그런 이유로 더 나을 수 있습니다.