2013-03-13 12 views
13

Tôi đang làm việc với một đối tượng IO (một số văn bản đầu ra STDOUT) và tôi đang cố gắng chuyển đổi nó thành chuỗi để tôi có thể thực hiện một số xử lý văn bản. Tôi muốn làm điều gì đó như thế này:Làm thế nào tôi có thể chuyển đổi một đối tượng IO thành một chuỗi trong Ruby?

my_io_object = $stdout 
#=> #<IO:<STDOUT>> 

my_io_object.puts('hi') #note: I know how to make 'hi' into a string, but this is a simplified example 
#=>hi 

my_io_object.to_s 

Tôi đã thử một vài điều và nhận được một vài lỗi:

my_io_object.read 
#=> IOError: not opened for reading 

my_io_object.open 
#=> NoMethodError: private method `open' called for #<IO:<STDOUT>> 

IO.read(my_io_object) 
#=> TypeError: can't convert IO into String 

Tôi đã đọc qua các phương thức lớp IO, và tôi không thể tìm ra cách thao tác dữ liệu trong đối tượng đó. Bất kỳ đề xuất?

+0

"IOError: không mở để đọc" phải là một đầu mối thích hợp. Hãy thử tìm kiếm lỗi đã nói. –

+0

Bạn chưa nói rõ những gì bạn đang cố gắng làm. Giải thích bạn muốn làm gì và chúng tôi có thể cung cấp cho bạn một cách tốt hơn để đến đó. Bạn nhận được văn bản STDOUT của mình như thế nào? –

+0

Cảm ơn, @theTinMan. Lời xin lỗi vì sự thiếu sáng tỏ - đó là sự phản ánh sự bối rối của tôi. Tôi đã kết thúc việc giải quyết điều này bằng cách chỉ thị STDOUT cho một đối tượng StringIO. – MothOnMars

Trả lời

21

tôi giải quyết điều này bằng cách chỉ đạo sản xuất của tôi cho một đối tượng StringIO thay vì STDOUT:

> output = StringIO.new 
#<StringIO:0x007fcb28629030> 
> output.puts('hi') 
nil 
> output.string 
"hi\n" 
-1

STDOUT chấp nhận chuỗi, chuỗi không cung cấp chuỗi. Bạn có thể viết cho nó, nhưng không thể đọc từ nó.

STDOUT.write("hello") # => hello 
STDOUT.read # => IOError: not opened for reading 
+0

Hmm. Vì vậy, là lựa chọn duy nhất của tôi để chỉ đạo đầu ra cho một tập tin, sau đó đọc từ tập tin để có được đối tượng chuỗi? – MothOnMars

+0

Bạn đang cố gắng làm gì? –

+1

Đó là một câu hỏi rất thú vị, như STDOUT thường là một tập tin, mặc dù một loại đặc biệt của tập tin. Đây là tài liệu [tee gem] (http://rubydoc.info/gems/tee/1.0.0/frames). Điều này có thể là những gì bạn đang có sau khi hành vi đi. – vgoff