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

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

또한 (몇 년 후 편집에서 말합니다) 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'

또는 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


답변

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