Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 이스케이프 문자

이 포스트에서 우리는 Ruby에서 이스케이프 문자에 대해 이야기할 것입니다. 문자를 이스케이프하는 방법, 작동 방식 및 일부 사용 사례에서 이스케이프를 완전히 피하는 방법을 배웁니다. \ 에 대해 모두 알고 있다고 생각하는 경우 , 꼭 다 읽고 놀라세요...

문자열에서 이스케이프 처리되는 문자에 대해 자세히 알아보겠습니다.

따옴표 이스케이프

Ruby에서 문자열을 사용할 때 문자열을 정의하는 데 사용한 따옴표를 문자열 자체에 넣어야 하는 경우가 있습니다. 그렇게 할 때 따옴표 문자를 백슬래시 \ 로 이스케이프할 수 있습니다. 기호.

# Escape quotes in double quoted strings
"Hello \"world\"!"
=> "Hello \"world\"!"
 
# Escape quotes in single quoted strings
'Hello \'world\'!'
=> "Hello 'world'!"

여기에서 Ruby는 기본적으로 출력에 대해 큰따옴표로 묶인 문자열을 사용하고 출력에서는 큰따옴표만 이스케이프한다는 것을 알 수 있습니다.

이스케이프 시퀀스

따옴표 외에도 문자열에서 이스케이프할 수 있는 기호가 더 있습니다. 예를 들어, 줄 바꿈은 \n로 표시됩니다. . 이것을 "이스케이프 시퀀스"라고 합니다.

"Hello\nworld"
=> "Hello\nworld"

반환되는 것은 우리가 생성한 것과 동일한 문자열이지만 \n에서 볼 수 있듯이 이스케이프 시퀀스임을 나타내는 강조 표시됩니다. 이제 이 문자열을 인쇄하면 리터럴 \n 인쇄되지 않지만 실제 줄 바꿈이 대신 인쇄됩니다.

puts "Hello\nworld"
=> Hello
world

작은따옴표 문자열에서는 작동하지 않습니다. \n 시퀀스는 리터럴 \n로 해석됩니다. . 큰따옴표로 묶인 문자열에서 동일한 결과를 얻으려면 백슬래시 기호를 이스케이프해야 합니다.

'\n'
=> "\\n"

같은 방식으로 작동하는 다른 이스케이프 시퀀스의 예는 다음과 같습니다. \t , \s\b , 각각 탭, 공백 및 백스페이스를 나타냅니다.

<헤더 클래스="ruby_magic">

작은따옴표 vs 및 큰따옴표

Ruby에서 작은따옴표와 큰따옴표로 묶인 문자열의 차이점은 문자열 정의가 이스케이프 시퀀스를 나타내는 방식입니다.

  • 이중 따옴표로 묶인 문자열을 사용하면 이스케이프 시퀀스를 작성할 수 있으며 Ruby는 번역된 의미를 출력합니다. \n 줄바꿈이 됩니다.
  • 단일 그러나 따옴표로 묶인 문자열은 이스케이프 시퀀스가 ​​이스케이프되어 리터럴 정의를 반환합니다. \n \n로 남아 있습니다. .

두 문자열 유형에는 물론 사용 사례가 있습니다. 번역된 의미, 줄 바꿈 또는 탭을 사용하기 위해 이스케이프 시퀀스와 함께 큰따옴표로 묶인 문자열을 사용할 가능성이 높습니다.

작은따옴표는 이스케이프 시퀀스 자체를 피하는 데 유용합니다. 사용법을 시연하거나 의도하지 않은 이스케이프 시퀀스를 실수로 사용하는 것을 방지하는 데 유용합니다.

puts "Line 1\nLine 2"
=> Line 1
Line 2
 
puts 'Using a \n we can indicate a newline.'
=> Using a \n we can indicate a newline.

보간 이스케이프

Ruby는 문자열 내부의 보간을 지원합니다. 그러나 다시 한 번 모든 문자열 정의가 동일하게 생성되는 것은 아닙니다. 보간은 큰따옴표로 묶인 문자열에서만 작동합니다.

아래 코드 예제에서 큰 따옴표로 묶인 문자열에서 보간이 작동하지만 Ruby가 작은 따옴표로 묶인 문자열에서 보간 시퀀스를 이스케이프하여 쓸모 없게 만드는 것을 볼 수 있습니다.

name = "world"
 
"Hello #{name}"
=> "Hello world"
 
'Hello #{name}'
=> "Hello \#{name}"

이 동작은 거의 모든 종류의 문자열 "magic"에 적용됩니다. 큰따옴표는 지원하지만 작은따옴표는 지원하지 않습니다.

<헤더 클래스="ruby_magic">

문자열의 백분율 표기법

Ruby의 백분율 표기법은 Perl 프로그래밍 언어에서 영감을 받은 것으로 몇 가지 일반적인 유형 정의에 대한 많은 약칭을 제공합니다.

작은따옴표 및 큰따옴표 문자열에 대한 동일한 동작이 백분율 표기법에도 적용됩니다.

  • %()%Q() 큰따옴표로 묶인 문자열과 같은 방식으로 작동합니다.
  • %q() 작은 따옴표로 묶인 문자열과 같은 방식으로 작동합니다.

백분율 표기법의 문제는 이제 괄호 문자 ()를 이스케이프해야 한다는 것입니다. 괄호의 균형이 맞지 않으면 따옴표 대신

이것이 Ruby가 백분율 표기법에 다른 기호도 사용할 수 있도록 허용하는 이유입니다:%[foo] , %{foo} , %-foo- , %?foo? 등. %"foo"도 지원합니다. 및 %'foo' .

여기에서 백분율 표기법을 사용할 때 Ruby가 문자열을 이스케이프 처리하는 것을 볼 수 있습니다.

%(Hello "world"!)
=> "Hello \"world\""
 
# With unbalanced parenthesis
%(Hello world\)!)
=> "Hello world)!"
 
# With balanced parenthesis
%(Hello (world)!)
=> "Hello (world)!"

다시 말하지만, 일반적인 작은따옴표 및 큰따옴표 문자열과 동일한 규칙이 여기에 적용됩니다. 이스케이프 시퀀스 및 보간은 기본적으로 작은따옴표 문자열로 이스케이프됩니다.

name = "world"
 
%(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"
 
%q(Hello\n "#{name}"!)
=> "Hello\\n \"\#{name}\"!"
 
%Q(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"

정규 표현식의 이스케이프 문자

이스케이프 문자는 정규식에서도 작동합니다. 정규식에서 많은 문자는 문자 그대로의 정의 이상을 나타냅니다.

. 모든 문자에 대한 와일드카드입니다. 대괄호 [] 범위 또는 선택, 괄호 ()를 나타냅니다. 표현식 등을 일치시킵니다. 리터럴 정의를 사용하려면 백슬래시 기호로 이스케이프 처리할 수도 있습니다.

/Hello \[world\]/
=> /Hello \[world\]/
 
/\[world\]/ =~ "Hello [world]"
=> 6

대괄호를 이스케이프하지 않으면 대신 대괄호 사이의 문자를 찾고 l 문자에서 첫 번째 일치 항목을 찾습니다. 위치 3의 "Hello"에서.

/[world]/ =~ "Hello [world]"
=> 2 # zero index

슬래시 기호 /를 이스케이프하지 않으려면 , 정규식을 정의하는 데 사용되는 다른 백분율 표기법을 사용할 수 있습니다.

%r{/world/}
=> /\/world\//

%r{} 사용 슬래시를 이스케이프할 필요가 없는 정규식을 정의할 수 있습니다. 결과에서 Ruby가 슬래시를 이스케이프 처리하는 것을 볼 수 있습니다.

줄 바꿈 이스케이프

이전에는 "newline" 이스케이프 시퀀스 \n를 이스케이프 처리했습니다. Ruby의 문자열에서. Ruby 자체에서도 줄 바꿈을 피할 수 있다는 것을 알고 계셨습니까?

예를 들어 메서드 호출에 대한 줄이 매우 길어 코드 스타일 가이드의 최대 줄 길이가 깨집니다.

ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"

인수를 별도의 줄에 배치하여 각 개별 줄을 더 짧게 만들 수 있습니다. 이것은 이전 줄이 쉼표 ,로 끝나는 한 작동합니다. , 더하기 기호 +와 같은 연산자 , 또는 괄호 ()로 묶인 메서드 호출의 일부입니다. .

ruby_method_with_many_arguments "Hello world",
  split: " ",
  join: "\n"
 
ruby_method_with_many_arguments(
  "Hello world",
  split: " ",
  join: "\n"
)

대신 괄호 ()로 래핑하지 않고 동일한 들여쓰기 수준에서 모든 인수를 정렬하려는 경우 백슬래시 \ 를 사용할 수 있습니다. 줄 바꿈을 피하기 위해.

ruby_method_with_many_arguments \
  my_string,
  split: " ",
  join: "\n"

여기서 우리가 하는 것은 실제로 Ruby에게 줄바꿈을 이스케이프하라고 말하는 것이 아니라 명령문이 다음 줄에서 계속될 것이라고 말하는 것입니다.

문자열 정의에서 줄바꿈 이스케이프

줄 끝을 이스케이프 처리하는 것은 문자열 정의와 같은 경우에도 작동합니다. 일반적으로 여러 줄 문자열이 있는 경우 더하기 기호 +를 사용할 수 있습니다. 두 줄의 문자열을 결합합니다.

"foo" +
  "bar"
=> "foobar"

이것은 두 줄에 두 개의 문자열을 만든 다음 하나로 결합합니다. 따라서 실제로 세 개의 문자열 개체가 생성됩니다.

더하기 기호를 사용하는 대신 백슬래시를 다시 사용하여 줄 바꿈을 이스케이프할 수 있습니다.

"foo" \
  "bar"
=> "foobar"

결과는 같습니까, 아니면 그렇습니까?

첫 번째 예에서는 실제로 두 개의 새 문자열을 결합하는 반면, 두 번째 예에서는 Ruby가 하나만 만듭니다. Ruby 인터프리터는 백슬래시 \ 를 볼 것입니다. 문자열 정의의 연속으로 두 줄을 기반으로 하나의 문자열만 만듭니다. 따라서 앱의 메모리 사용량이 훨씬 더 좋습니다.

결론

Ruby 및 기타 많은 프로그래밍 언어에서 이스케이프 문자는 상당히 혼란스러울 수 있습니다. 갑자기 특정 문자 조합이 작은 따옴표로 묶인 문자열 안에서 사용되는 것과 비교하여 큰 따옴표로 묶인 문자열 안에서 다른 의미를 갖게 됩니다.

이 작은 가이드가 Ruby에서 문자와 시퀀스를 올바르게 이스케이프하는 방법을 이해하는 데 도움이 되었기를 바랍니다. 큰따옴표 문자열과 작은따옴표 문자열의 차이점은 여기에서 핵심입니다.

이스케이프 시퀀스 및 보간 문자열 "magic"은 실제로 큰따옴표 문자열에서만 작동하지만 작은따옴표 문자열에서는 작동하지 않습니다.

Ruby 자체에서 코드를 이스케이프하는 다른 방법도 있습니다. 백분율 표기법은 문자열과 정규식에서 특정 문자를 항상 이스케이프하지 않도록 도와줍니다.

그러나 백슬래시는 여러 줄 문자열을 작성하고 다음 줄에 Ruby 코드 줄을 계속하는 데에도 매우 유용합니다. 코드를 깔끔하고 읽기 쉽게 유지하기 위해 많이 사용합니다.

더 알고 싶거나 Ruby에서 문자를 이스케이프하는 것에 대한 구체적인 질문이 있는 경우 @AppSignal로 알려주십시오.

재미있는 참고 사항:Markdown으로 작성된 이 게시물에서는 백슬래시 기호를 상당히 많이 사용해야 했습니다. Ruby와 마찬가지로 Markdown은 특정 문자의 이스케이프를 허용합니다. 일반적으로 Markdown에서는 코드 블록 자체를 이스케이프하므로 코드 블록에서 백슬래시를 실제로 래핑할 수 없습니다. 대신 공백을 탈출하도록 했습니다.

`\` # Doesn't work
`\ ` # Works :)