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での関数型プログラミング(完全ガイド)
関数型プログラミングについて聞いたばかりで、いくつか質問があるかもしれません。 いいね… 関数型プログラミングとは正確には何ですか? オブジェクト指向プログラミングと比較してどうですか? Rubyで関数型プログラミングを使用する必要がありますか? これらの質問に答えて、これがどのように機能するかをよりよく理解できるようにします。 関数型プログラミングとは これは単なる流行や派手な言葉ではなく、長い間存在していた実際のプログラミングパラダイムですが、最近人気を取り戻しています。 そして、このパラダイムの背後にある基本的な考え方は、あなたが思っているよりも理解しやすいです。 関数型
-
Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)
列挙可能とは何ですか? 列挙可能は反復法のコレクションです 、Rubyモジュール、そしてRubyを優れたプログラミング言語にする大きな部分です。 列挙可能には次のような便利なメソッドが含まれます : マップ 選択 注入 列挙可能なメソッドは、ブロックを与えることで機能します。 そのブロックで、すべての要素で何をしたいのかを伝えます。 例 : [1,2,3].map { |n| n * 2 } すべての数値が2倍になった新しい配列を提供します。 正確に何が起こるかは、使用する方法、 mapによって異なります。 すべての値を変換するのに役立ちます、 select リス