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

Rubyのgetsメソッドとchompメソッドの使い方を徹底解説

Rubyでプログラムを書いていると、「ユーザーに質問をして答えを入力してもらいたい」という場面によく出会います。

どうやって実現すればよいのでしょうか?

その答えが、Rubyのgetsメソッドです。getsを呼び出すと、プログラムはキーボードからの入力を待ち受けます。ユーザーが何かを入力してEnterキーを押すと、その内容が文字列として返されます。

結果として得られるのは?

入力された内容を含む文字列(String)です。この文字列を変数に代入すれば、プログラムの中で自由に使えるようになります。

もっとも定番の例が「挨拶プログラム」です。

コードは次のようになります。

name = gets.chomp

puts "Hello #{name}, nice to meet you!"

#{name}のような記法は「式展開(文字列インターポーレーション)」と呼ばれ、文字列の中に変数の値を埋め込むことができます。

実際に試して、動きを確かめてみましょう。

  • まず、このコードを「greeting.rb」というファイル名で保存します
  • 次に、ターミナルから「ruby greeting.rb」を実行します

名前を入力すると、プログラムがあなたに挨拶してくれます!

なかなか面白いですよね。

chompメソッドの役割とは?

さて、ここで疑問です。

このchompは一体何をしているのでしょうか?

chompは、getsの結果をとても特殊な方法で変化させるRubyのメソッドです。

試しに削除してみましょう。直前のドット(.)も含めて取り除き、name = gets.chompname = getsに変更します。

コードを保存して再実行すると…

挨拶メッセージが1行にまとまらず、2行に分かれて表示されることがわかります。

これはなぜ起こるのでしょうか?

詳しく掘り下げて確認していきましょう!

改行文字と特殊文字を理解する

Rubyは、getsメソッドが有効な間に入力されたすべての内容を読み取ります。

先ほどの挨拶プログラムの場合、これにはあなたの名前に加えて、ある特殊な「改行」文字も含まれます。この改行文字こそが、挨拶メッセージを2行に分けてしまう原因なのです!

それがこちら、改行文字です。

\n

この種の特殊文字は通常は目に見えず、改行・空白・色などの形でだけ現れます。

見たいからといって、1万ドルもする魔法の懐中電灯が必要になるわけではありません。もちろん冗談です!

必要なのはpメソッドかinspectメソッドだけです。

使用例:

p name
# "Jesus\n"

ありましたね!これがあの「改行」文字(\n)です。

ここで最初の疑問に戻りましょう。

chompの目的は、文字列の末尾にある改行文字を取り除くことです。

見てきたとおり、これはとても便利な働きをしてくれます!

もうひとつの例:if文への影響

改行文字などの特殊文字は、文字列の見た目だけでなく、それ以外の動作にも影響を及ぼします。

たとえば、if文の条件判定にも影響するのです!

例:

name = gets

if name == "David"
  puts "Hello David, we were expecting you!"
end

このコードでは、getschompを使わないと、改行文字(\n)のせいで2つの文字列が一致しなくなり、条件はfalseと評価されてしまいます。

ちなみに…

これはgets以外から取得した文字列にも当てはまります。データベースやファイル、その他のソースから読み込んだデータにも同じ注意が必要です。

こうした特殊文字には常に気を配るようにしましょう!

chomp・chop・stripの違いを比較

ユーザー入力をきれいに整えるのに役立つメソッドは、chompのほかにchopstripがあります。

stripを使うと、文字列前後の空白(ホワイトスペース)を取り除けます。

例:

"    John Smith    ".strip

chopは、常に文字列の最後の1文字を取り除きます。

先頭の文字を削除する方法

場合によっては、文字列の先頭から文字を削除したいこともあるでしょう。

その場合は次のように書けます。

str = "Mr. John"

str[0..3] = ""

str
# "John"

このコードは、最初の4文字を削除しています。

getsメソッドが2つある?エラーが出たら$stdin.getsを試そう

実は、特別なケースが存在します。

それは、単なるgetsの代わりに$stdin.getsを使う必要があるケースです。

次のようなエラーが出た場合は:

`gets': No such file or directory @ rb_sysopen

なぜこんなことが起きるのでしょうか?

理由は、getsメソッドには2つのバージョンがあるからです。

  • デフォルトのバージョンは、コマンドライン引数をファイル名として扱い、そのファイルから読み込もうとします
  • もう一方のバージョン($stdin.gets)は、常に標準入力(ユーザー入力)から読み込みます

つまり、getsを使っていてこのようなエラーを目にしたら、$stdin.getsに置き換えてみてください。

まとめ

この記事では、getsメソッドとchompメソッドについて、それぞれの役割・仕組み・そして便利な理由を学びました。

引き続き、他のRubyチュートリアルでも学習を進めていきましょう。

最後までお読みいただきありがとうございました!🙂


  1. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この

  2. Rubyの配列(Array)クラスの使い方徹底解説!基本操作と便利なメソッド一覧

    配列(Array)とは? 配列はRubyに組み込まれたクラスで、0個以上の要素をリスト形式で保持することができます。さらに、要素の追加・アクセス・繰り返し処理を簡単に行えるメソッドも多数用意されています。 もし配列が存在しなければ、値ごとに個別の変数を用意しなければならず、管理が非常に大変になります。 例: a = 1 b = 2 c = 3 しかし、配列を使えば次のように書けます: numbers = [1, 2, 3] さらに嬉しいことに、配列の中には何でも入れられます! 例えば: 数値 文字列 さらに別の配列!(これは多次元配列になります) それでは、配列を最大限に活用できる