konchanxxx / menta

MENTAのタスク管理用リポジトリ
0 stars 0 forks source link

プロを目指すruby 4.10.5 redoについて #28

Closed konoken closed 5 years ago

konoken commented 5 years ago

概要

タイトルについて、応用したコードを作成

実現したいこと

コンソール上で’はい’を選択しない限り、無限ループとなる。

困っていること

’はい’もしくは’いいえ’を記入しても、それ以降のputs内容が表示されず、なぜか上のputs内容が繰り返される。

困っていることがバグの場合は事象やログ、エラーメッセージをできるだけそのまま(抜粋などしない)下記に記載してください。

途中でctr+cで抜け出しました。

mbp:ruby-book mac$ ruby rola.rb
ローラ:わたしを おしろまで つれてかえってくれますね?
はい or いいえ
はい
ローラ:わたしを おしろまで つれてかえってくれますね?
はい or いいえ
いいえ
ローラ:わたしを おしろまで つれてかえってくれますね?
はい or いいえ
^Crola.rb:5:in `gets': Interrupt
    from rola.rb:5:in `gets'
    from rola.rb:5:in `block in <main>'
    from rola.rb:2:in `each'
    from rola.rb:2:in `<main>'

解決するために行ったこと

5行目:answerで入力した内容が下のif文に入り、それ以降の処理が走ると思ったが、うまくいかない。

問題となっている箇所の予想

answer = gets
    if answer == 'いいえ'
        puts "#{prince}:そんな、ひどい…"
    end
    redo unless answer == 'はい'
    puts "#{prince}:うれしゅうございます。ぽっ"

問題となっているアプリケーションのGitHub URL

https://github.com/kenkono/pro-ruby/blob/master/rola.rb

konchanxxx commented 5 years ago

これは標準入力の末尾に改行コードが入っているためだと思います:bow: gets.chompとして上げると改行コードを取り除けるのでうまく動作するかなと思います:bow: 標準入力は基本的にchompしておいたほうが安全ですね:smile:

kenkono commented 5 years ago
answer = gets.chomp

追加したところ、上手くいきました! 改行コードとは、つまり/nがあったために正しい判定ができなかったということでしょうか?

konchanxxx commented 5 years ago

そうですね。正しくはスラッシュ/ではなくバックスラッシュ\ n です 試しに自分で改行コードを入れてprintメソッドで出力すると挙動の違いが確認できます。

[1] pry(main)> hoge = "hoge\n"
=> "hoge\n"
[2] pry(main)> print hoge
hoge
=> nil

# 改行されている

[3] pry(main)> fuga = "fuga"
=> "fuga"
[4] pry(main)> print fuga
fuga=> nil

# 改行されていない
kenkono commented 5 years ago

確認取れました。 ありがとうございます。