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

Ruby의 StringIO:작동 방식 및 사용 방법

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의 흥미로운 용도를 알고 있다면 댓글로 알려주시고 공유하는 것을 잊지 마세요. 더 많은 사람들이 즐길 수 있도록!