Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyのStringIO:仕組みと使用方法

IOのように動作するオブジェクトを探していますか オブジェクト(ファイル、ソケットなど)ですが、文字列のように制御できますか?

次に、StringIO あなたのためです。

注意すべきいくつかの例と事柄をお見せしましょう!

基本的な例

StringIOを作成するには これを実行できるオブジェクト:

io = StringIO.new("abc")

次に、getsなどのメソッドを使用してこのオブジェクトから読み取ることができます 、readeach_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の興味深い使用法について知っている場合 コメントでお知らせください。これを共有することを忘れないでください より多くの人が楽しめる記事です!


  1. Rubyエイリアスキーワードの使用方法

    Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた