RubyのStringIO:仕組みと使用方法
IO
のように動作するオブジェクトを探していますか オブジェクト(ファイル、ソケットなど)ですが、文字列のように制御できますか?
次に、StringIO
あなたのためです。
注意すべきいくつかの例と事柄をお見せしましょう!
基本的な例
StringIO
を作成するには これを実行できるオブジェクト:
io = StringIO.new("abc")
次に、gets
などのメソッドを使用してこのオブジェクトから読み取ることができます 、read
&each_line
。
最も便利な方法で便利なテーブルを作成しました:
取得 | 1行の入力を読み取る |
読む | 特定のバイト数を読み取ります(デフォルトではすべて) |
each_line | ブロックを指定して、各行を繰り返します |
each_char | ブロックを指定して、各文字を繰り返し処理します |
<< | |
巻き戻し | |
文字列 | 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
構文解析(テキストをトークンのセットに分割することでテキストの意味を理解する)などを行うためのものです。
これらの2つのクラスは、名前に「文字列」が含まれていることに加えて、内部の位置ポインタを使用していることを共有しています。 。
標準の入力と出力の置き換え
Kernel#getsメソッドを使用してユーザーに出力を要求するコマンドラインアプリケーションを作成しているとしましょう…
…このコードをテストする場合は、毎回手動で何かを入力する必要があります。
では、自動テストは全体像から外れているのでしょうか?
いいえ、そうではありません!
ここでStringIO
救助に来る。 StringIO
を初期化できます オブジェクトをテスト入力に置き換えてから、$stdin
が指す標準入力オブジェクトを置き換えます (これは、gets
を呼び出すときにRubyがユーザー入力を探す場所です。 。
例 :
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
の興味深い使用法について知っている場合 コメントでお知らせください。これを共有することを忘れないでください より多くの人が楽しめる記事です!
-
Rubyエイリアスキーワードの使用方法
Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin
-
RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた