Programing

Ruby : 연결없이 여러 줄로 된 문자열을 쓸 수 있습니까?

lottogame 2020. 2. 27. 22:07
반응형

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'

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


이 답변에는 내가 필요로하는 것을 얻는 데 도움이되는 조각이 있습니다 (추가 공백없이 쉬운 여러 줄 연결). 그러나 실제 답변이 없었기 때문에 여기에서 컴파일하고 있습니다.

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) 을 사용해야합니다 . 그렇지 않으면 들여 쓰기 공백으로 인해 식별자가 문자열의 연속으로 해석됩니다.

이것은 많은 타이핑을 저장하지는 않지만 + 기호를 사용하는 것보다 나아 보입니다.

편집 : 하나 더 추가 :

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"

예, 추가 줄 바꿈이 마음에 들지 않으면 :

 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

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

예를 들면 다음과 같습니다.

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

이미 읽은 것처럼 여러 줄 문자열에 대한 여러 구문이 있습니다. 내가 가장 좋아하는 것은 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"줄에는 코드에서 들여 쓰기로 인해 선행 공백이 포함됩니다. 이 공백이 바람직하지 않은 경우 지금하는 것처럼 연결된 문자열을 사용해야합니다.


때때로 \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"을 제거해야하는 경우 각 줄 끝에 백 슬래시 "\"를 사용하십시오.


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

최근 Ruby 2.3의 새로운 기능을 squiggly HEREDOC사용하면 최소한의 변경으로 여러 줄 문자열을 멋진 방식으로 작성할 수 있으므로이 줄을 사용하면 여러 줄을 멋진 방식으로 .squish쓸 수 있습니다!

[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'

<<는 문자열의 연결 연산자입니다


당신이 경우에 마음 여분의 공백과 줄 바꿈을, 당신은 사용할 수 있습니다

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

이 제안은 자동 들여 쓰기가 문자열의 각 부분을 적절히 들여 쓸 수있는 여기 문서 및 긴 문자열에 비해 이점이 있습니다. 그러나 효율성 비용이 발생합니다.


각 줄의 괄호를 닫지 않으려면 백 슬래시와 함께 큰 따옴표를 사용하여 개행을 이스케이프 처리하면됩니다.

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

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



반응형