[TIL]9月17日


今日習った内容


BackjunからJavaScript入力を受信


Node.js「readline」モジュール


チームは毎晩5時30分から行われるアルゴリズム学習で、白駿2667号:単番解答を行った.
solution関数内で論理を記述するプログラマーとは異なり,Baek Junは入力値の処理を単独で行う必要がある.プログラマーやバーコードのようにskeletonのプラットフォームを簡単に提供することに慣れている私にとって、入力処理を単独で行う必要があるのは最も不便で、最も見慣れない場所です.しかし、白俊は本当に膨大なアルゴリズムの問題を持っていますか?それらの質問に答えたいです.
そこで今日はjavascriptを使って入力を受信する方法を整理し、バックグラウンドプラットフォームをより熟知しています.
検索してみると、JavaScriptを使って入力を受信する方法は大きく2つあります.
  • Node.js readlineモジュール
  • の使用
  • Node.js file Sysemモジュール
  • の使用
    今日はreadlineモジュール入力の使い方について説明します.
    Node.js公式ドキュメントでreadlineモードについて以下に説明する.
    The readline module provides an interface for reading data from a Readable stream (such as process.stdin) one line at a time.

    モジュールの読み込み

    const readline = require('readline');

    インタフェースインスタンスの作成

    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    The readline.createInterface()メソッドはnew readlineです.インタフェースインスタンスを作成する方法.このインスタンスは、単一の入力可読ストリームと単一の出力書き込み可能ストリームに関連付ける必要があるため、インスタンスの作成時に現在実行中のノードです.jsプロセスのstdinとstdoutを接続します.

    ラインイベントリスナーの追加


    入力ストリームが終了行の入力(n、r、またはrn)を受信すると、「line」イベントが発生します.このイベントは、通常、ユーザーがEnterキーを押したり、車に戻ったりするときに発生します.
    入力された各行は入力値としてリスナー関数に渡され、リスナー関数操作によって入力された入力値を処理できます.
    この場合、通常は配列に追加され、次のように記述できます.
    const arr = []
    rl.on('line', (input) => {
      arr.push(input)
      console.log(arr)
    });
    
    コードを作成した後、vsCodeを開き、端末からファイルがあるディレクトリに移動します.
    その後、端末にnode 파일이름.jsを打つと、次の入力ボックスが表示されます.

    値を入力します

    行を入力してEnterキーを押すたびに「line」イベントが発生し、リスナー関数の動作が表示されます.また、入力した値はstring時間でなければならないことがわかります!実際の符号化テストでは、数値入力値が与えられた場合、入力を受け入れ、map関数でデータ型を変更する必要があります.

    「close」イベントリスナーの追加


    でもこのように楽しく入力すると気になるところがあります「いつまで入力しますか...?」
    入力した値で問題を解きたいのですが、どんどん入力を受けます.
    入力を終了するイベントは「close」イベントです.このアクティビティは、次の場合に開始されます.
  • The rl.close() method is called
  • The input stream receives its 'end' event;
  • The input stream receives Ctrl+D to signal end-of-transmission (EOT);
  • The input stream receives Ctrl+C to signal SIGINT and there is no 'SIGINT' event listener - registered on the readline.Interface instance.
  • const readline = require("readline");
    const rl = readline.createInterface({
    	input: process.stdin,
    	output: process.stdout,
    });
    const arr = [];
    rl.on("line", (line) => {
    	arr.push(line);
    	console.log(arr);
    	if (arr.length === 5) {
    		rl.close();
    	}
    });
    
    rl.on("close", function () {
    	console.log(arr.length);
    	console.log("입력 끝난다?");
    });
    

    上のコードでは、5回の入力を受け取ってrlを使用します.close()を起動します.そして、リスナーによって起動した「close」イベントが検出され、closeイベントリスナー関数が実行される様子が表示されます.
    したがって,アルゴリズム問題を解く場合は,「line」イベント関数部分に入力関連論理を記述し,「close」イベントリスナー関数内部に問題解決論理を記述すればよい.
    しかし白駿では、rl.close()を別途呼ぶ必要がなくても動作可能である.

    process.exit() ?


    また,closeイベント終了時には命令フロー終了のprocess.exit();が書かれているが,いずれにしてもcloseイベント関数が呼び出されて実行されると,より多くの入力がないため,プログラムを終了するという意味であるはずである.
    でもNodejsドキュメントでは、
    The readline.Interface instance is finished once the 'close' event is emitted.
    書いてある...ではcloseイベントは番組ごとに1回という意味でしょうか?process.exit()を使う理由が気になります.
    おもしろいのはNodejs file Sysemモジュールを使用する方法はprocessです.つまり、exit()は書かない.
    const readline = require("readline");
    const rl = readline.createInterface({
    	input: process.stdin,
    	output: process.stdout,
    });
    const arr = [];
    rl.on("line", (line) => {
    	arr.push(line);
    	console.log(arr);
    });
    
    rl.on("close", function () {
    	console.log(arr.length);
    	console.log("프로세스 끝난다?");
    	//process.exit();
    });
    

    に感銘を与える


    JavascriptでBaek Junを解くのはちょっと不便だけどこんなNodeこれはjs入出力を理解する機会であり,有益である.
    無駄な知識はない.
    原理が分かれば、暗記も楽になります!

    リファレンス

  • nodejs.org
  • [伯俊]伯俊からノードへjs I/Oメソッドまとめ