Computer >> Máy Tính >  >> Lập trình >> Ruby

StringIO trong Ruby:Cách thức hoạt động và cách sử dụng nó

Bạn đang tìm kiếm một đối tượng hoạt động giống như một IO đối tượng (tệp, ổ cắm, v.v.), nhưng bạn có thể kiểm soát như một chuỗi?

Sau đó, StringIO là dành cho bạn.

Hãy để tôi chỉ cho bạn một số ví dụ và những điều cần lưu ý!

Ví dụ cơ bản

Để tạo một StringIO đối tượng bạn có thể làm điều này:

io = StringIO.new("abc")

Sau đó, bạn có thể đọc từ đối tượng này bằng các phương thức như gets , read &each_line .

Tôi đã tạo một bảng hữu ích cho bạn với các phương pháp hữu ích nhất:

Phương pháp Mô tả
được Đọc một dòng đầu vào
đọc Đọc một lượng byte cụ thể (tất cả theo mặc định)
each_line Cho một khối, hãy lặp lại trên mỗi dòng
each_char Cho một khối, hãy lặp lại từng ký tự
<< Nối dữ liệu
tua lại Đặt lại con trỏ vị trí bên trong
string Trả về một chuỗi thực từ đối tượng stringio

Lưu ý rằng StringIO có một con trỏ vị trí.

Con trỏ này theo dõi số byte bạn đã đọc, giống như đối tượng tệp.

Vì vậy, mỗi khi bạn gọi một phương thức như gets hoặc read nó sẽ cung cấp cho bạn lượng dữ liệu đó và nâng cao con trỏ.

Thậm chí các phương thức có thể liệt kê như map hoặc each_line sẽ nâng cao con trỏ vị trí, vì vậy hãy ghi nhớ điều đó.

io.each_line { |line| puts line }

Bạn có thể đặt lại con trỏ vị trí về đầu bằng cách sử dụng rewind phương pháp:

io.pos
# 45

io.rewind

io.pos
# 0

Đó là những điều cơ bản.

Tôi sẽ chỉ cho bạn một số cách sử dụng thực tế cho StringIO , nhưng trước tiên hãy để tôi cho bạn xem một thứ khác.

Còn về StringScanner?

Bây giờ bạn đã thấy những gì StringIO có thể làm được, nhưng Thư viện tiêu chuẩn Ruby bao gồm một lớp khác liên quan đến chuỗi.

Lớp đó là StringScanner.

Điều này có thể gây nhầm lẫn vì chúng có tên và phương thức tương tự nhau, nhưng hãy để tôi giúp bạn thấy sự khác biệt.

Điều chính là đây :

Một StringIO đối tượng có thể thay thế một IO khác đối tượng (như một File hoặc một Socket ), nhưng StringScanner được dùng để thực hiện những việc như phân tích cú pháp (hiểu một số văn bản bằng cách chia nó thành một tập hợp các mã thông báo).

Hai lớp này vẫn có chung một số điểm, ngoài việc có “Chuỗi” trong tên của chúng, cả hai đều sử dụng con trỏ vị trí nội bộ .

Thay thế đầu vào và đầu ra tiêu chuẩn

Giả sử bạn đang viết một ứng dụng dòng lệnh yêu cầu người dùng xuất đầu ra bằng phương thức Kernel # get…

… Nếu bạn muốn kiểm tra mã này, bạn sẽ phải nhập một cái gì đó bằng tay mọi lúc.

Vậy thử nghiệm tự động có nằm ngoài bức tranh không?

Không, không phải vậy!

Đây là nơi StringIO đến để giải cứu. Bạn có thể khởi tạo StringIO đối tượng bằng đầu vào thử nghiệm của bạn và sau đó thay thế đối tượng đầu vào chuẩn được trỏ bởi $stdin (đây là nơi Ruby tìm kiếm thông tin đầu vào của người dùng khi bạn gọi gets ).

Ví dụ :

io     = StringIO.new("input")
$stdin = io

gets
# input

Kỹ thuật này cũng có thể được sử dụng để nắm bắt đầu ra từ các phương thức như puts .

Phương thức hiển thị in tới thiết bị đầu ra mặc định, được gọi là 'đầu ra tiêu chuẩn'. Trong Ruby, điều này được đại diện bởi một IO đối tượng mà bạn có thể thay thế bằng StringIO của mình đối tượng.

Ví dụ :

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."

Điều này liên quan nhiều hơn so với phiên bản đầu vào, vì chúng tôi muốn đảm bảo khôi phục STDOUT ban đầu đối tượng &để tua lại StringIO của chúng tôi để chúng tôi có thể đọc đầu ra.

Lưu ý rằng hầu hết các khuôn khổ thử nghiệm đều bao gồm một phương pháp để thực hiện việc này cho bạn (khẳng định_output cho Minitest và trình kết hợp đầu ra trong RSpec), nhưng luôn tuyệt vời khi biết những gì đang diễn ra phía sau hậu trường 🙂

Tóm tắt

Bạn đã tìm hiểu về StringIO lớp, mô phỏng một IO thực để nó có thể hoạt động như một sự thay thế cho loại đối tượng đó.

Điều này có thể hữu ích cho việc kiểm tra các lớp ghi đầu ra ra màn hình hoặc yêu cầu người dùng nhập thông qua thiết bị đầu cuối.

Nếu bạn biết về một số công dụng thú vị của StringIO cho chúng tôi biết trong phần nhận xét và đừng quên chia sẻ điều này bài viết để nhiều người có thể thưởng thức nó!