Techioz Blog

case ステートメントで .include?() を使用できますか?ルビー

概要

Rubyの勉強を始めました。ゲームを構築する小さなプロジェクトがあり、ユーザー入力を受け取り、それに応じて処理する関数を作成しようとしました。

def Game.listener
  print "> "

  while listen = $stdin.gets.chomp.downcase

    case listen
    when (listen.include?("navigate"))
      puts "Navigate to #{listen}"
      break
    when ($player_items.include?(listen))
      Items.use(listen)
      break
    end

    puts "Not a option"
    print "> "
  end
end

ただし、case ステートメントは、navigate と入力したことを検出できません。これを修正する方法はありますか、それとも私が完全に間違っている場合、誰かが私を正しい方向に向けてくれますか?

問題を解決するこの方法を見つけましたが、それは安全で信頼できる方法ですか?

  while listen = $stdin.gets.chomp
      case listen.include?(listen)
      when listen.include?("navigate")
        puts "Navigate to #{listen}"
      when listen.include?("test")
        puts "test"
      when $player_items.include?(listen)
        puts "Using the #{$player_items[listen]}"
        break
      else
        puts "Not a option"
      end
      print "> "
   end

解決策

if-elsif ブロックの代わりに case を使用したい場合は、次のように記述できます (case の後の空白に注意してください)。

while listen = $stdin.gets.chomp
  case
  when listen.include?('navigate')
    puts "Navigate to #{listen}"

  when listen.include?('test')
    puts 'test'
  
  when $player_items.include?(listen)
    puts "Using the #{$player_items[listen]}"
    break

  else
    puts "Not an option"
  end

  print "> "
end