줄 바꿈을 제거하지 않고 Ruby에서 여러 줄의 긴 문자열 나누기


221

우리는 최근에 루비 스타일 가이드를 결정했습니다. 칙령 중 하나는 줄이 80자를 넘지 않아야한다는 것입니다. 이것이 Rails 프로젝트이기 때문에, 우리는 종종 약간 더 긴 문자열을 가지고 있습니다. 즉 " User X는 항상 80 자 스타일 제한에 맞지 않는 Thing Y에 대한 메시지를 보내려고했습니다 ."

긴 문자열이 여러 줄에 걸쳐있는 세 가지 방법이 있다는 것을 알고 있습니다.

  • 헤레 독
  • %큐{}
  • 실제 문자열 연결.

그러나이 모든 경우에 더 많은 계산주기가 걸리게되는데 이는 어리석은 것처럼 보입니다. 문자열 연결은 분명하지만, HEREDOC%Q같이 개행을 제거해야합니다 .gsub(/\n$/, '').

이것을 수행하는 순수한 구문 방법이 있습니까? 즉, 전체 문자열을 한 줄에 두는 것과 같습니다. 목표는 코드를 좀 더 읽기 쉽게하기 위해 추가주기를 사용하지 않는 것입니다. (예, 나는 당신이 그 절충을 많이 만들어야한다는 것을 알고 있습니다 ... 그러나 문자열 길이에 대해서는 이것이 어리석은 것처럼 보입니다.)

업데이트 : 백 슬래시는 들여 쓰기를 잃어 버리기 때문에 원하는 스타일이 아닙니다. 스타일 / 가독성에 실제로 영향을 미칩니다.

예:

if foo
  string = "this is a \  
string that spans lines"  
end

위의 내용을 읽기가 어렵습니다.

편집 : 아래에 답변을 추가했습니다. 3 년 후 우리는 이제 구불 구불 한 이교도를 가지고 있습니다.


해당 문자열을 제외시키는 것이 좋습니다.
Cheezmeister


\n줄 바꿈 문자 를 유지할지 여부는 확실하지 않습니다. 가장 좋은 대답은 그것들을 유지하지 못하지만 당신의 대답은 그렇지 않습니다. 질문은 "줄 바꿈을 제거하지 않고"라고 말하지만 설명에는 "[...] 줄 바꿈을 제거해야합니다"라고 표시되어 있습니다.
Bryan Dimas 2012

답변:


432

아마 이것이 당신이 찾고있는 것입니까?

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"

4
응 예, 아주 완벽합니다. 실제로 후드 아래에서 연결을 수행합니까? (+?를 숨기고)
chug2k

13
나는 그것이 아니라고 확신합니다. String # + undef'ing과 재정의를 시도했지만 거기에 아무것도 전송되지 않는 것 같습니다.
Jessehz

또한 같은 줄에 문자열을 나란히 놓아도 작동하지만 그다지 유용하지는 않습니다.
Jessehz

3
나는 또한 Emily의 솔루션을 좋아합니다. 그러나 어떤 이유로 나는 다음 줄의 선행 공백을 스스로 추측하지 않고 들여 쓰기 할 수 있기 때문에 이것에 더 편합니다.
Amin Ariana

5
다시 연결하여 관련 질문에 대한 Amadan의 답변을 확인하십시오 . 그는 바이트 코드를 사용하여 문자열을 연결하는 것이 아니라 하나의 긴 문자열로 취급 함을 증명합니다.
Tom Hundt

55

\Ruby의 모든 라인이 다음 라인에서 계속됨을 나타내는 데 사용할 수 있습니다 . 이것은 문자열에서도 작동합니다.

string = "this is a \
string that spans lines"

puts string.inspect

출력합니다 "this is a string that spans lines"


11
응 꽤 간단합니다. 글쎄, 아마 너무 많이 물어볼 수 있지만 다음 줄은 들여 쓰기 할 수 없습니다. 등호와 일치시킬 수 있다면 이상적입니다.
chug2k

5
참고 : 백 슬래시 후에는 공백을 사용할 수 없습니다. 마지막 문자 여야합니다.
Julian Mann

3
@Jessehz의 답변을 참조하십시오. 적절한 들여 쓰기로 코드를 형식화하는 방법은 각 줄을 따옴표로 묶는 것입니다.
orrd

36

3 년 후, 루비 2.3에는 해결책이 있습니다.

class Subscription
  def warning_message
    <<~HEREDOC
      Subscription expiring soon!
      Your free trial will expire in #{days_until_expiration} days.
      Please update your billing information.
    HEREDOC
  end
end

블로그 게시물 링크 : https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

최소 들여 쓰기 행의 들여 쓰기는 컨텐츠의 각 행에서 제거됩니다.


29
다른 궁금한 <<~HEREDOC점이 있으면 개행 문자를 유지하고 들여 쓰기 만 제거하십시오. 예 :line 1\nline 2\nline 3\n
Bryan Dimas 2012

1
개행을 제거하려면 여전히 추가 계산이 필요하지만 OP 종류의 암시는 바람직하지 않습니다.
henrebotha

1
@henrebotha 예, 그러나 OP는 더 명확하게 말하면 "전체 줄을 한 줄로 묶는 것과 동일합니다".
Nick

따라서 귀하는 귀하의 질문에 heredoc을 사용하고 싶지 않으며 개행을 제거해야한다고 명시 적으로 밝혔습니다. 귀하의 답변은 heredoc을 사용하며 "후 처리"를 피해야합니다.
lamont

17

매우 긴 URL을 작성하려고 할 때이 문제가 발생했습니다. 다음 작동합니다.

image_url = %w(
    http://minio.127.0.0.1.xip.io:9000/
    bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
    28ed3774-b234-4de2-9a11-7d657707f79c?
    X-Amz-Algorithm=AWS4-HMAC-SHA256&
    X-Amz-Credential=ABABABABABABABABA
    %2Fus-east-1%2Fs3%2Faws4_request&
    X-Amz-Date=20170702T000940Z&
    X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
    X-Amz-Signature=ABABABABABABABABABABAB
    ABABABABABABABABABABABABABABABABABABA
).join

url 문자열이 형성 될 때 줄 바꿈, 공백이 없어야합니다. 줄 바꿈을 원하면 HEREDOC을 사용하십시오.

여기에는 모든 줄에 따옴표와 역 슬래시없이 가독성, 수정 용이성에 대한 들여 쓰기가 있습니다. 현을 합류하는 비용은 무시할 만하다.


10

공백과 보간을 원했지만 줄 바꿈을 원하지 않았기 때문에 Zack의 답변을 수정했습니다 .

%W[
  It's a nice day "#{name}"
  for a walk!
].join(' ')

name = 'fred'이것이 생산하는 곳It's a nice day "fred" for a walk!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.