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

Rubyの入出力(IO):決定的なガイド

I/Oは入力/出力の略です。

入力とは、何か(コンピューター、Rubyメソッド、脳)に入力されるすべてのデータと情報を意味します。

入力の例

  • キーボードのプレスキーを押します
  • マウスクリック
  • 読んだ本

出力とは、入力の結果として出てくるすべてのものを意味します。

出力の例

  • 1+1の結果
  • 読んだ記事の要約を書く
  • コーヒー

Rubyでは、I / Oについて話すとき、通常、ファイルの読み取り、ネットワークソケットの操作、画面への情報の印刷を指します。

IOクラスを理解する

IOはRubyのクラスでもあります。

Fileなどの他のオブジェクトの親クラスです &Socket

すべてのIOオブジェクトにはこれらの操作があります

  • 開く/閉じる
  • 読む
  • 書き込み

IOオブジェクトはファイル記述子に基づいています 。

コンピューターで実行中のすべてのプロセスには、内部情報テーブルがあります。

この表の一部には、ファイル記述子のリストが含まれています。

ファイル記述子は、整数とファイル名の間のマッピングです。 。

Linuxでのファイル記述子のこのリストを見ることができます。

このコマンドを使用

# Assuming you have irb open on another window

ls -lh /proc/`pgrep irb`/fd/

# lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 1 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 2 -> /dev/pts/3

sysopenを使用して、Rubyで新しいファイル記述子を作成できます。 メソッド。

fd = IO.sysopen('/dev/null', 'w')

# 10

これで、このファイル記述子(10)を使用して通信チャネルを開くことができます。 。

このように

io = IO.new(fd)

そしてそれに書き込みます

io << 'orange'

IOに注意してください ファイル記述子が実際のファイル、デバイス(ハードディスクなど)、またはネットワークソケットにマップされているかどうかは関係ありません。

書き込み用のファイル記述子を開く方法

sysopenを使用して新しいファイル記述子を作成する場合 、またはFile.openを使用してファイルを開きます 、いくつかのオプションがあります。

デフォルトでは、通信は読み取り専用です。

モードを指定できます

  • r (読み取り、デフォルト)
  • w (書き込み)
  • w+ (読み取りと書き込み)
  • a (追加)

fd = IO.sysopen('/dev/tty1', 'w+')

これにより、/dev/tty1が開きます 読み取り+書き込みモードで。

3つの標準IOストリーム

新しいプログラム(エディター、ターミナル、Rubyインタープリターなど)を開くと、デフォルトで3つの通信チャネルが開きます。

3つのファイル記述子。

彼らは

  • stdin(入力)
  • stdout(出力)
  • stderr(エラー)

Rubyでは、定数形式またはグローバル変数形式を使用して、これらに直接アクセスできます。

$stdout << "abc\n"

$stdoutに書き込むとき 、putsメソッドを呼び出すのと同じです。

標準出力 は端末に関連付けられています。

lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3

この/dev/pts/3 は、端末が画面にテキストを表示するために読み取る仮想デバイスです。

標準エラー は出力にも使用されますが、端末にこのコンテンツを通常のテキストとは異なる方法(大きなフォントや異なる色など)で表示する機会を与えます。

warnを使用できます 標準エラーに出力する方法。

標準入力 ここからユーザー入力が読み取られます。

getsを使用できます 標準入力から読み取るメソッド。

STDOUTをフラッシュしてバッファリングを無効にする方法

IOオブジェクトには内部バッファがあります。

一定量の入力データは、読み取る前に保存されます

そのため、putsを使用することがあります ...

ただし、プログラムが終了するか、バッファがいっぱいになるまで、何も表示されません。

このようにバッファリングを無効にすることができます

$stdout.sync = true

または、手動でバッファをフラッシュできます

$stdout.flush

バッファを無効にすると、待つことなく出力が表示されます。

チャンクの読み取り

IOオブジェクトから読み取るときは、read ストリームがEND-OF-FILE(EOF)信号で終了するまで、ストリームは閉じられるか、特定のバイト数を受信します。

ネットワークプログラミングや大きなファイルの場合は、小さなチャンクで読むと便利です。

このようにチャンクで読むことができます

data = ""

until io.eof?
  data << io.read(2048)
end

このコードを使用すると、ダウンロード全体が完了するのを待たずに、データが利用可能になったときにデータを処理できます。

eof?に注意してください 「ブロック」します。

ブロッキングとは、コードがスリープするまでになることを意味します オペレーティングシステムは、読み取る新しいデータがあることを通知します 。

双方向通信にIOパイプを使用する方法

Rubyではパイプを作成できます。

パイプは、相互に接続されているファイル記述子のペアです。

これは、プロセス間通信(IPC)に使用されます。

read, write = IO.pipe

これはforkで使用できます 現在のプロセスのコピーを作成するためのメソッド(Windowsでは使用できません)。

これらの2つのプロセスは、パイプを使用して通信できます。

if fork
  write.close

  puts "Message received: #{read.gets}"

  read.close
else
  read.close

  write << "Buy some bananas!"

  write.close
end

結果

# Message received: Buy some bananas!

カーネルオープンメソッドの使用方法

Rubyには非常に柔軟なopenがあります メソッド。

ファイルを開いたり、URLからデータを読み取ったり、パイプを開いて外部コマンドを実行したりすることもできます。

open "abc.txt"

そのため、この方法は避ける必要があります

これらすべてのことができるのはセキュリティリスクです。

代わりに、特定のopenを使用することをお勧めします 必要な方法。

File.open           # File
IO.popen            # Process open
URI.parse(...).open # URL open

これらはすべてIOを返します オブジェクト。

概要

Rubyでの入出力について学びました!ファイル記述子、IOについて学習しました クラス、バッファリング、チャンクの読み取り、標準のIO ストリーム。

Rubyの入出力(IO):決定的なガイド

よろしければ、この記事を共有することを忘れないでください。

読んでくれてありがとう。


  1. Rubyでの関数型プログラミング(完全ガイド)

    関数型プログラミングについて聞いたばかりで、いくつか質問があるかもしれません。 いいね… 関数型プログラミングとは正確には何ですか? オブジェクト指向プログラミングと比較してどうですか? Rubyで関数型プログラミングを使用する必要がありますか? これらの質問に答えて、これがどのように機能するかをよりよく理解できるようにします。 関数型プログラミングとは これは単なる流行や派手な言葉ではなく、長い間存在していた実際のプログラミングパラダイムですが、最近人気を取り戻しています。 そして、このパラダイムの背後にある基本的な考え方は、あなたが思っているよりも理解しやすいです。 関数型

  2. Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)

    列挙可能とは何ですか? 列挙可能は反復法のコレクションです 、Rubyモジュール、そしてRubyを優れたプログラミング言語にする大きな部分です。 列挙可能には次のような便利なメソッドが含まれます : マップ 選択 注入 列挙可能なメソッドは、ブロックを与えることで機能します。 そのブロックで、すべての要素で何をしたいのかを伝えます。 例 : [1,2,3].map { |n| n * 2 } すべての数値が2倍になった新しい配列を提供します。 正確に何が起こるかは、使用する方法、 mapによって異なります。 すべての値を変換するのに役立ちます、 select リス