0
0

More than 1 year has passed since last update.

【Ruby】標準入力をcase文で処理しようとしたらハマった話

Posted at

はじめに

初めまして。Rubyを練習し始めて1ヶ月未満の初心者です。あるプログラミング課題をやっていて疑問に残ったことがあったので、記事に残そうと思います。

概要

Rubyで標準入力を使うとき、入力内容によって分岐させるためにcase文を用いたらおかしなことになったので、備忘録として解決策を残しておく

結論

  • 標準入力は改行(\n)が付いてくるので、そのまま条件分岐に使うと危険
  • 改行を除去するにはchompメソッドを使う

環境

  • macOS
  • ruby version 3.0.5

問題点

以下のようなコードを書いて、入力された値をcase文に適用させようとしました。

qiita.rb
input = gets
case input
when "a"
  puts "aと入力"
when "b"
  puts "bと入力"
else
  puts "それ以外"
end

実行して、aと入力してみる。

$ ruby qiita.rb 
$ a
$ それ以外

...あれ?
"a"を標準入力で渡したはずなのに、when "a" の条件に分岐せず、else(デフォルトで実行されるケース)の"それ以外"が表示されている。

試しに、標準入力のgetsを普通の文字列"a"に置き換えてみる。

qiita.rb
input = "a"
case input
when "a"
  puts "aと入力"
when "b"
  puts "bと入力"
else
  puts "それ以外"
end
$ ruby qiita.rb 
$ aと入力

今度は正しくwhen "a"に分岐した。

解決

inputpメソッドで表示してみたら分かりました。

qiita.rb
input = gets
p input
$ ruby qiita.rb 
$ a
$ "a\n"

どうやら、標準入力は単なる文字列ではなく、改行(\n)も含まれているみたいです。
改行を削除するには、chompメソッドを使用します。

qiita.rb
input = gets
case input.chomp
when "a"
  puts "aと入力"
when "b"
  puts "bと入力"
else
  puts "それ以外"
end
$ ruby qiita.rb 
$ a
$ aと入力

解決できました!
ちなみに、もっと簡潔な書き方もあります。

qiita.rb
case gets.chomp
when "a"
  puts "aと入力"
when "b"
  puts "bと入力"
else
  puts "それ以外"
end

終わりに

解いてみたらあっけないミスでしたね...。case文とif文の違いかと思って調べてたので、単に標準入力で返される値の違いと知って少し悲しくなりました。
もし間違い等ありましたら、気軽にコメントで指摘していただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0