我可以在case语句中使用.include?()吗? Ruby

13

我开始学习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

1
使用正则表达式,可以使用[]符号、scanmatch函数。 - Sagar Pandya
@sagarpandya82 谢谢。你能给我一个这是如何工作的例子吗?我对这个领域很新。 - MrSlippyFist
1
(listen.include?("navigate")) 等于 truefalse,因此如果 listen 等于该逻辑值,则执行以下行。这不是您想要的。您需要将 case listen 更改为 case - Cary Swoveland
很高兴能够帮助,但我现在无法发布答案,但会有其他人解答问题。请不要急于接受任何答案,因为您不希望让其他人感到泄气。 - Cary Swoveland
1
listen 是一个字符串,listen.include?('navigate') 是一个布尔值。布尔值永远不会等于或匹配一个字符串,因此该分支永远不会执行...对于所有其他分支也是如此。 - Jörg W Mittag
显示剩余4条评论
2个回答

19

如果您想要使用 case 代替 if-elsif 块,则可以按照以下方式编写代码(请注意 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

0
在您的情况下,请使用 if elsif
if listen.include?("navigate")
  # ...
elsif $player_items.include?(listen)
  # ...
end

哇,回复好快!那个方法可以,谢谢。但我在想,因为游戏将来会“监听”更多的输入,是否有更简洁的方法?因此我选择使用 case。 - MrSlippyFist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接