programing

루비: 연결 없이 여러 줄의 문자열을 쓸 수 있습니까?

magicmemo 2023. 7. 20. 21:51
반응형

루비: 연결 없이 여러 줄의 문자열을 쓸 수 있습니까?

이것을 조금 더 좋게 보이게 하는 방법이 있습니까?

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'

연결을 암시하는 방법이 있을까요?

이 답변에는 필요한 내용(공백 공간 없이 여러 줄로 쉽게 연결)을 얻을 수 있도록 도와준 부분이 있지만 실제 답변이 없었기 때문에 다음과 같이 컴파일하고 있습니다.

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_SQLp <<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"

루비 2.0에서는 이제 그냥 사용할 수 있습니다.%

예:

    SQL = %{
      SELECT user, name
      FROM users
      WHERE users.id = #{var}
      LIMIT #{var2}
    }

예, 추가적인 새 줄을 삽입해도 괜찮으시다면:

 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'

또는 다음을 사용할 수 있습니다.

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

이 질문은 저로 하여금 헤레독이 어떻게 작동하는지 이해하기 위해 토끼굴을 빠져들게 했습니다.답변이 너무 길어졌다면 죄송합니다.

꼬불꼬불한 헤레독 <<~새 줄과 올바른 들여쓰기(Ruby 2.3 이후 사용 가능)를 사용하여 다중 줄 문자열을 정의하려는 경우 다음과 같이 검색합니다.

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, 따옴표 및 백분율 문자열 리터럴 모두 원인이 됨) 백슬래시를 삽입하여 줄 연속선을 사용할 수 있습니다.\줄의 공백이 아닌 마지막 문자로 표시됩니다.이렇게 하면 줄이 계속되고 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...from...where..."

레일즈를 사용하는 경우 선행 및 후행 공백 문자열을 제거하고 연속된 모든 공백(새 줄, 탭 및 모든 공백)을 단일 공간으로 축소합니다.

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

자세한 정보:

Ruby HEREDOC 구문

문자열에 대한 문서 표기법은 코드에서 긴 텍스트 블록을 인라인으로 지정하는 방법입니다.시작은<<사용자 정의 String(String 종료자)이 뒤에 옵니다.줄의 맨 처음에서 문자열 끝 종단기를 찾을 때까지 다음 모든 줄이 연결됩니다.

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 String 입니다. 문, 자열끝단줄의시작부있분합어니야다에.

  puts <<EOS 
    def foo
      print "foo"
    end
  EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS"

피하기 , 이상황피위해하기을,해위,<<-구문이 생성되었습니다.EOS 터미네이터를 들여보내서 코드를 더 멋지게 보이게 할 수 있습니다.사의라인이 <<-그리고 EOS 터미네이터는 여전히 모든 들여쓰기를 포함하여 전체 확장에서 사용됩니다.

def printExample
  puts <<-EOS # Use <<- to indent End of String terminator
    def foo
      print "foo"
    end
  EOS
end
# -> "....def foo\n......print "foo"\n....end"

2로, 꼬불꼬불한 Ruby 2.3을 가지고 있습니다.<<~그러면 선행 공백이 제거됩니다.

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이 있다면 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

문제 해결

Ruby가 파일을 구문 분석할 때 오류가 발생하면 HEREDOC가 있는 추가 선행 또는 후행 공백이나 꼬불꼬불한 HEREDOC가 있는 추가 후행 공백이 있을 가능성이 높습니다.예:

표시되는 내용:

    database_yml = <<~EOS
      production:
        database: #{fetch(:user)}
        adapter: postgresql
        pool: 5
        timeout: 5000
    EOS  

루비가 알려주는 것:

SyntaxError: .../sample.rb:xx: can't find string "EOS" anywhere before EOF
...sample.rb:xx: syntax error, unexpected end-of-input, expecting `end'

문제:

Spot the extra spaces after the terminating EOS

EOS 종료 후 추가 공간을 찾습니다.

문자열 리터럴 비율

다음과 같은 괄호 쌍에서 백분율 기호와 문자열을 사용하는 방법은 RubyDoc을 참조하십시오.%(...),%[...],%{...}쌍예: 또다같영숫아쌍문닌자의가자은등음는과▁such쌍▁of%+...+

라스트 워즈

마지막으로, "연결을 의미하는 방법이 있습니까?"라는 원래 질문에 대한 답을 얻기 위해 다음과 같이 대답했습니다.루비는 두 문자열(단일 따옴표와 이중 따옴표)이 연속으로 발견되는 경우 항상 연결을 의미합니다.

puts "select..." 'from table...' "where..."
# -> "select...from table...where..."

주의할 점은 이것이 줄 바꿈에서 작동하지 않는다는 것입니다. 왜냐하면 Ruby는 문 끝을 해석하고 있고 줄 위에 문자열만 있는 결과 줄은 아무 것도 하지 않기 때문입니다.

이미 읽은 대로 다중 줄 문자열에 대한 여러 구문이 있습니다.제가 좋아하는 것은 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}

저는 사실 이런 종류의 다중 줄 문자열을 어떻게 부르는지 전혀 모르기 때문에 그냥 펄 다중 줄이라고 부르도록 하겠습니다.

그러나 Mark와 Peter가 제안한 대로 Perl 다중 행을 사용하든 hereocs를 사용하든 간에 잠재적으로 불필요한 공백이 발생하게 됩니다.이 예제와 예제 모두에서 "시작" 및 "장소" 행은 코드에서 들여쓰기 때문에 선행 공백을 포함합니다.이 공백을 사용하지 않으려면 지금처럼 연결된 문자열을 사용해야 합니다.

줄 .\n 예:

conn.exec <<-eos.squish
 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

큰따옴표를 사용할 수도 있습니다.

x = """
this is 
a multiline
string
"""

2.3.3 :012 > x
 => "\nthis is\na multiline\nstring\n"

줄 바꿈 "\n"을 제거해야 할 경우 각 줄 끝에 백슬래시 "\"를 사용합니다.

기타 옵션:

#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

Ruby 2 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 = <<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 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"
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'

<<은 문자열의 연결 연산자입니다.

만약 당신이 추가 공간과 새로운 줄을 신경 쓴다면, 당신은 사용할 수 있습니다.

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

이 제안은 자동 들여쓰기가 문자열의 각 부분을 적절하게 들여쓸 수 있는 여기 문서와 긴 문자열에 비해 이점이 있습니다.하지만 효율성에는 비용이 많이 듭니다.

오늘의 우아한 답변:

<<~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에서는 안전할 수 있지만, 제 경우에는 안전하지 않으며 처리해야 할 텍스트 블록이 많습니다.)

이것은 거의 틀림없이 추한 것이지만, 세레독에서 새 줄을 역슬래시 이스케이프하여 결과 문자열에서 생략할 수 있습니다.

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

E. 보(I) 없이는 이 을 계산할 수 .E) 없이는 이 값을 계산할 수 없습니다.<<~'END_OF_INPUT') 그러니까 조심하세요.#{expressions}여기서 평가되지만 원래 코드에서는 평가되지 않습니다.A. 윌슨의 대답이 그런 이유로 더 나을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/2337510/ruby-can-i-write-multi-line-string-with-no-concatenation

반응형