Ruby で gets を使用してユーザー入力を受け入れる

Nurudeen Ibrahim 2022年4月18日
Ruby で gets を使用してユーザー入力を受け入れる

Ruby でコマンドライン(CLI)アプリケーションを構築する場合、一般的な機能の 1つは、ユーザーの名前やはい/いいえの応答など、ユーザーからの入力を受け取ることです。ここで、gets キーワードが役立ちます。

このチュートリアルでは、ユーザーが自分の名前を入力し、入力した名前を使用して挨拶できる非常に単純な CLI プログラムを作成する方法を示します。

コード例:

puts "Hi, welcome to my app."
puts "Enter your name to get started: "
name = gets
puts "Hello #{name}, nice to have you here"

出力:

Hi, welcome to my app.
Enter your name to get started:

上記は、コードを実行した後に得られる出力です。この時点で、プログラムは私に私の名前を入力するように求めています。これは gets が行うことです。プロンプトを作成し、ユーザー入力を待ちます。

以下は、私の名前を John と入力し、Enterキーを押した後に得られる完全な出力です。

Hi, welcome to my app.
Enter your name to get started:
John
Hello John
, nice to have you here

上記の出力で何か奇妙なことに気づいたに違いありません。なぜ Hello John, nice to have you here という挨拶が John の後に壊れたのですか?実際に何が起こっているのかを理解するには、変数 name を調べてください。

コード例:

puts "Hi, welcome to my app."
puts "Enter your name to get started: "
name = gets
puts name.inspect
puts "Hello #{name}, nice to have you here"

出力:

Hi, welcome to my app.
Enter your name to get started:
John
"John\n"
Hello John
, nice to have you here

上記は、私の名前として John を入力した後に得られる完全な出力です。name 変数が John\n として表示されていることがわかります。

これが gets の動作です。ユーザー入力として受け取った値に自動的に\n を追加します。これは改行文字と呼ばれ、テキストに表示される場合は常に、その時点でテキストが途切れ、新しい行に続く必要があることを意味します。

これを修正する良い方法は、chomp メソッドを使用することです。このメソッドは、改行文字(\n)だけでなく、キャリッジリターン文字(\r)も含めて、末尾の特殊文字をすべて削除します。chomp の仕組みについて詳しくは、こちらをご覧ください。

コード例:

puts "Hi, welcome to my app."
puts "Enter your name to get started: "
name = gets.chomp
puts "Hello #{name}, nice to have you here"

出力:

Hi, welcome to my app.
Enter your name to get started:
John
Hello John, nice to have you here