DATA 상수의 이상한 경우

3298 단어 programmingruby
Ruby의 상수DATA에 익숙하지 않더라도 쉽게 지나칠 수 있으므로 너무 나쁘게 생각하지 마십시오. 야생에서 보는 것이 드물 뿐만 아니라 내가 소유하고 실제로 읽은 9권의 Ruby 책 중 2권만이 일반적으로 곡괭이 책으로 알려진 전역 상수인 "Programming Ruby" by Dave Thomas"The Ruby Programming Language" by David Flanagan and Yukihiro Matsumoto (알다시피, 언어를 만든 사람).
DATA 상수를 이해하려면 먼저 __END__ 토큰을 이해해야 합니다. Ruby 인터프리터가 __END__ 토큰을 찾으면 프로그램 코드 실행을 중지합니다. 내가 이것에 대해 처음 들었을 때 발표자는 인터프리터가 토큰 이후의 모든 것을 "무시"할 것이라고 말했고 그것을 사용하여 파일 끝에 있는 코드 덩어리를 "주석"하는 데 사용하여 데모했습니다. 이것은 깔끔한 트릭이었지만 불행히도 부정확했으며 __END__ 토큰의 가장 멋진 부분을 완전히 무시했습니다.

나는 __END__에 대해 거의 잊고 있었습니다.
그의 멋진 RubyConf 토크에서 이 문제를 제기했습니다(비디오가 공개되면 링크를 게시하겠습니다). 나는 그의 이야기를 망치지 않을 것이지만 Nick은 내 호기심을 자극하고 Ruby Archaeology의 토끼 굴로 나를 보내줄 충분한 추가 정보를 제공했습니다.

루비 인터프리터는 토큰 뒤의 모든 항목을 "무시"하지만 실제로는 __END__ 토큰 이후의 모든 항목을 데이터로 취급하고 콘텐츠를 가져와서 DATA 상수에 할당합니다. 이 정보로 무장하면 DATA 상수를 이해하기가 훨씬 쉬워집니다. DATA는 IO 증기입니다. 파일을 열고 내용을 읽는 것과 마찬가지로 DATA 를 사용하여 동일한 작업을 수행할 수 있습니다.

그렇다면 실제로는 어떤 모습일까요? 이 같은:

# end_data_demo.rb
puts DATA.read.tr("\n", " ")

__END__
Look
at
this
data


터미널에서 ruby end_data_demo.rb를 실행하면 "Look at this data"가 반환됩니다.

꽤 멋지죠? 아니? 글쎄요. 거기에 YAML을 저장할 수도 있습니다.



이제 "좋아요, 좀 멋집니다. 하지만 실제로 이것을 왜 또는 언제 사용해야 할까요?"라고 생각할 수 있습니다. 올해의 시간을 감안할 때 좀 더 실용적인 데모를 보여 드리겠습니다.

많은 분들이 하고 계시는 Advent of Code . 지금 하고 있거나 루비에서 해본 적이 있다면 퍼즐 입력을 얻기 위해 다음과 같은 작업을 했을 것입니다.

input = File.readlines('.puzzle_input.txt')

# Your logic here


이것은 작동하지만 입력을 위해 별도의 파일이 필요합니다. 올해 AoC를 수행하는 방법은 다음과 같습니다.

input = DATA.readlines

# My logic here

__END__
My
puzzle
input


하루, 하나의 파일.
DATA는 매우 멋진 트릭이지만 불행히도 다중 파일 응용 프로그램에는 설정되어 있지 않습니다... 그러나 모든 것이 손실되지는 않습니다. 재미와 이익을 위해 __END__를 악용할 게시물을 계속 지켜봐 주시기 바랍니다.

좋은 웹페이지 즐겨찾기