IO
처럼 작동하는 개체를 찾고 있습니까? 객체(파일, 소켓 등)이지만 문자열처럼 제어할 수 있습니까?
그런 다음 StringIO
당신을 위한 것입니다.
몇 가지 예와 주의해야 할 사항을 보여드리겠습니다.
기본 예
StringIO
를 생성하려면 개체:
io = StringIO.new("abc")
그런 다음 gets
와 같은 메서드를 사용하여 이 객체에서 읽을 수 있습니다. , read
&each_line
.
가장 유용한 방법으로 편리한 표를 만들었습니다.
메서드 | 설명 |
---|---|
얻기 | 입력 한 줄 읽기 |
읽기 | 특정 양의 바이트 읽기(기본값 모두) |
각 줄 | 블록이 주어지면 각 줄에 대해 반복 |
각 문자 | 블록이 주어지면 각 문자에 대해 반복 |
<< | 데이터 추가 |
되감기 | 내부 위치 포인터 재설정 |
문자열 | stringio 객체에서 실제 문자열을 반환 |
StringIO
위치 포인터가 있습니다.
이 포인터는 파일 개체처럼 읽은 바이트 수를 추적합니다.
따라서 gets
와 같은 메소드를 호출할 때마다 또는 read
그것은 당신에게 그 양의 데이터를 제공하고 포인터를 전진시킬 것입니다.
map
과 같은 열거 가능한 메서드도 또는 each_line
위치 포인터가 앞으로 이동하므로 이를 염두에 두십시오.
io.each_line { |line| puts line }줄을 넣습니다.
rewind
를 사용하여 위치 포인터를 처음으로 재설정할 수 있습니다. 방법:
io.pos # 45 io.rewind io.pos # 0
여기까지가 기본 사항입니다.
StringIO
의 실용적인 사용법을 보여드리겠습니다. , 하지만 먼저 다른 것을 보여드리겠습니다.
StringScanner는 어떻습니까?
이제 StringIO
할 수 있지만 Ruby 표준 라이브러리에는 다른 문자열 관련 클래스가 포함되어 있습니다.
그 클래스는 StringScanner입니다.
이름과 방법이 비슷해서 헷갈릴 수 있지만 차이점을 알아보도록 할게요.
중요한 것은 이것입니다 :
StringIO
개체가 다른 IO
를 대체할 수 있습니다. 개체(예:File
또는 Socket
), 그러나 StringScanner
구문 분석(일부 텍스트를 토큰 세트로 분해하여 의미 파악)과 같은 작업을 수행하기 위한 것입니다.
이 두 클래스는 이름에 '문자열'이 있다는 점 외에 여전히 무언가를 공유하고 있으며 둘 다 내부 위치 포인터를 사용합니다. .
표준 입력 및 출력 교체
Kernel#gets 메소드를 사용하여 사용자에게 출력을 요청하는 명령줄 응용 프로그램을 작성한다고 가정해 보겠습니다...
...이 코드를 테스트하려면 매번 손으로 무언가를 입력해야 합니다.
그렇다면 자동화된 테스트는 불가능합니까?
아닙니다!
여기서 StringIO
구하러 옵니다. StringIO
를 초기화할 수 있습니다. 개체를 테스트 입력으로 바꾼 다음 $stdin
이 가리키는 표준 입력 개체를 바꿉니다. (여기서 Ruby는 gets
를 호출할 때 사용자 입력을 찾습니다. ).
예 :
io = StringIO.new("input") $stdin = io gets # input
이 기술은 puts
와 같은 메서드에서 출력을 캡처하는 데에도 사용할 수 있습니다. .
표시 방법은 '표준 출력'으로 알려진 기본 출력 장치로 인쇄합니다. Ruby에서 이것은 IO
로 표현됩니다. StringIO
로 대체할 수 있는 개체 개체.
예 :
io = StringIO.new("") $stdout = io # Print to $stdout puts "Jesus Castello is from Spain & likes to help people learn Ruby." # Restore original value $stdout = STDOUT io.rewind io.read # "Jesus Castello is from Spain & likes to help people learn Ruby."
이것은 원래 STDOUT
를 복원하기를 원하기 때문에 입력 버전보다 더 복잡합니다. 개체 및 StringIO
되감기 그래서 우리는 출력을 읽을 수 있습니다.
대부분의 테스트 프레임워크에는 이를 수행하는 메서드가 포함되어 있지만(Minitest의 경우 assert_output 및 RSpec의 출력 매처), 배후에서 무슨 일이 일어나는지 아는 것은 항상 좋습니다. 🙂
요약
StringIO
에 대해 배웠습니다. 실제 IO
를 에뮬레이트하는 클래스 개체가 그러한 종류의 개체를 대체할 수 있도록 합니다.
이는 화면에 출력을 쓰거나 터미널을 통한 사용자 입력이 필요한 클래스를 테스트하는 데 유용할 수 있습니다.
StringIO
의 흥미로운 용도를 알고 있다면 댓글로 알려주시고 공유하는 것을 잊지 마세요. 더 많은 사람들이 즐길 수 있도록!