2

私は 2 日前に Ruby 言語を調べ始めたばかりで、C 派生言語の考え方にあまりにも制約されていることをすぐに知りました... 文字列そのものを比較しようとしています。

def menu_listen
    action = gets
    while !(action.eql?("up")) && !(action.eql?("down")) && !(action.eql?("close")) do
        puts "'#{action}' is not a valid command at this time."
        action = gets
    end
    return action
end

...以前は次のように書かれていました:

def main_listen
    action = gets
    while action != "up" && action != "down" && action != "close" do
        puts "'#{action}' is not a valid command at this time."
        action = gets
    end
    return action
end

thisString.eql?(thatString) は thisString == thatString と同じであるとこのサイトで読みましたが、どちらも機能しないため、そう思われます。コマンド プロンプトに入力した入力は、while ループを通過せず、応答として次のようになります。

'down
' is not a valid command at this time.

これは、Enter キーを押すと、コマンド プロンプト入力の新しい行としても保存されるということですか? 文字列比較が正しく機能するようにこれを実装する方法を誰か教えてもらえますか?

4

3 に答える 3

4

getseol文字もgets.chomp取り込むため、実際の文字列のみを取り込むために使用します。このchompメソッドは、キャリッジリターンと改行を削除します。

&&文字列の比較に関しては、入力が連鎖ではなく、事前定義された文字列の配列に存在するかどうかを比較するのが少し好きeql?です。たとえば、次のようになります。

while not %w(up down close).include? action do

これはチェーンよりもクリーンで、変更も簡単です。

于 2012-11-16T00:04:31.887 に答える
2
def menu_listen
  until r = (['up', 'down', 'close'] & [t = gets.strip]).first 
    puts "#{t} is not a valid command"
  end
  r
end
于 2012-11-16T00:17:26.260 に答える
0

必要なのは、文字列の末尾からセパレーターを削除するString#chompメソッドだけです。

    def menu_listen
      while 1 do
        action = gets.chomp
        return action if %w(down up close).include? action.downcase
        puts "#{action}' is not a valid command at this time."
      end
    end
于 2012-11-16T00:17:11.670 に答える