여기 문서가 있습니다

저번에 Crystal formatter tool 을 수정하면서 heredoc 과 여러 개heredocs 를 메서드의 인수로 사용하는 방법에 대해 배웠습니다.

시작하자 ...

Heredoc이란 무엇입니까?



설명서는 다음과 같이 말합니다.

A here document or heredoc can be useful for writing strings spanning over multiple lines.



그리고 그것들이 어떻게 정의되는지 계속 설명합니다:

A heredoc is denoted by <<- followed by a heredoc identifier [...]. The heredoc starts in the following line and ends with the next line that contains only the heredoc identifier.



heredocs를 사용하는 방법?



다음은 heredoc를 정의하는 방법에 대한 예입니다.

<<-HERE_BE_DOC
Hello World
Beware, here be dragons!
HERE_BE_DOC


A heredoc (다른 String 와 마찬가지로)를 변수에 할당할 수 있습니다.

dragons = <<-HERE_BE_DOC
Hello World
Beware, here be dragons!
HERE_BE_DOC

puts dragons


이 예는 다음을 출력합니다.

Hello World
Beware, here be dragons!


물론 메소드의 인수로 사용할 수 있습니다.

def string_length(str : String)
  str.size
end

puts string_length <<-HERE_BE_DOC
   Hello World
   Beware, here be dragons!
HERE_BE_DOC


이 예는 다음을 출력합니다.

42


참고: 원래 줄 바꿈과 공백을 유지합니다! 🤩

Heredoc 및 방법



따라서 a heredoc 가 a String 를 정의하는 방법이라면 a heredoc 는 모든 String 메서드에 응답합니다(문자열이기 때문에). 마지막 예는 #size 방법을 사용할 때 정확히 이것을 보여줍니다.

따라서 다음 예를 시도해 보겠습니다.

"Hello World".size # => 11


그러나 heredoc를 사용하여:

puts <<-WORLD
Hello World
WORLD.size



Error: Unterminated heredoc: can't find "WORLD" anywhere before the end of file


오! heredoc의 끝을 찾을 수 없습니다(컴파일러가 WORLD.size를 전체 단어로 "읽고 있음"을 의미) 🤔 ... 잠깐만요 🤓💡 다음과 같이 수정해 보겠습니다.

<<-WORLD
Hello World
WORLD
.size # => 11


그것은 효과가 있었습니다 🤓🎉 하지만 이 솔루션은 해킹처럼 느껴집니다. 예제를 작성하는 올바른(직관적이지는 않지만) 방법을 찾기 위해 문서로 이동해 보겠습니다.

After the heredoc identifier, and in that same line, anything that follows continues the original expression that came before the heredoc. It's as if the end of the starting heredoc identifier is the end of the string.



따라서 다음이 작동해야 합니다.

<<-WORLD.size # => 11
Hello World
WORLD


엄청난! 작동하고 있습니다!
(나중에 도움이 될 수 있으므로 고정해야 합니다. 📌)

여러 heredocs 사용



이 게시물의 시작 부분에서 말했듯이 tests 방법을 사용하여 일부 assert_format 를 작성했습니다. 이 메서드의 처음 두 인수에 초점을 맞추겠습니다. 첫 번째 인수는 포맷터에 대한 입력이고 두 번째 인수는 입력을 포맷한 후 예상되는 결과입니다.

우리는 소스 코드를 형식화하고 있기 때문에 heredoc를 사용하는 것이 정말 편리할 것입니다(들여쓰기와 개행을 사용하여 코드를 읽기 쉽게 형식화할 수 있기 때문입니다). 단 하나의 세부 사항: 내가 사용하려고 했던 잘못된 방법 🙈

나는 썼다 :

assert_format <<-BEFORE
  alias Foo=
  Bar
  BEFORE, 
  <<-AFTER
  alias Foo = Bar
  AFTER


컴파일러는 다음을 반환했습니다.

Error: Unterminated heredoc: can't find "BEFORE" anywhere before the end of file


익숙한 것 같죠? WORLD.size 예를 기억하십니까? 음, 여기서 BEFORE, 와 같은 문제가 있습니다.

그리고 솔루션은 문서에 설명된 것과 동일합니다. 다음과 같이 두 가지heredocs를 메서드에 전달해야 합니다.

assert_format <<-BEFORE, <<-AFTER
  alias Foo=
  Bar
  BEFORE
  alias Foo = Bar
  AFTER


작동하고 있습니다! 🎉

문제의 핵심은 첫 줄assert_format <<-BEFORE, <<-AFTER에 있었다. 다음 문서를 기억하십시오.

It's as if the end of the starting heredoc identifier is the end of the string.



Heredoc 대 문자열



마지막으로 strings 대신 heredocs를 사용한 동일한 예가 있습니다.

assert_format "  alias Foo=\n  Bar", "  alias Foo = Bar"


많은 것을 얻지 못한 것처럼 보이지만 여기에는 여러 개의 newlines 및 들여쓰기가 있는 더 복잡한 example이 있습니다.

작별 인사하고 나중에 보자



Heredoc에 대해, Heredoc의 메서드를 사용하는 방법과 메서드에 대한 인수로 다중heredocs을 사용하는 방법을 배웠습니다.

이 게시물을 작성하는 동안 위의 모든 드래곤은 피해를 입지 않았습니다! 😁

당신이 그것을 즐겼기를 바랍니다! 😃


사진 제공: Clint Bustrillos on Unsplash

좋은 웹페이지 즐겨찾기