はじめに
初めまして。Rubyを練習し始めて1ヶ月未満の初心者です。あるプログラミング課題をやっていて疑問に残ったことがあったので、記事に残そうと思います。
概要
Rubyで標準入力を使うとき、入力内容によって分岐させるためにcase文を用いたらおかしなことになったので、備忘録として解決策を残しておく
結論
- 標準入力は改行(
\n)が付いてくるので、そのまま条件分岐に使うと危険 - 改行を除去するには
chompメソッドを使う
環境
- macOS
- ruby version 3.0.5
問題点
以下のようなコードを書いて、入力された値をcase文に適用させようとしました。
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"に置き換えてみる。
input = "a"
case input
when "a"
puts "aと入力"
when "b"
puts "bと入力"
else
puts "それ以外"
end
$ ruby qiita.rb
$ aと入力
今度は正しくwhen "a"に分岐した。
解決
inputをpメソッドで表示してみたら分かりました。
input = gets
p input
$ ruby qiita.rb
$ a
$ "a\n"
どうやら、標準入力は単なる文字列ではなく、改行(\n)も含まれているみたいです。
改行を削除するには、chompメソッドを使用します。
input = gets
case input.chomp
when "a"
puts "aと入力"
when "b"
puts "bと入力"
else
puts "それ以外"
end
$ ruby qiita.rb
$ a
$ aと入力
解決できました!
ちなみに、もっと簡潔な書き方もあります。
case gets.chomp
when "a"
puts "aと入力"
when "b"
puts "bと入力"
else
puts "それ以外"
end
終わりに
解いてみたらあっけないミスでしたね...。case文とif文の違いかと思って調べてたので、単に標準入力で返される値の違いと知って少し悲しくなりました。
もし間違い等ありましたら、気軽にコメントで指摘していただけると幸いです。