我可以在案例陈述中使用 .include?() 吗?红宝石

Posted

技术标签:

【中文标题】我可以在案例陈述中使用 .include?() 吗?红宝石【英文标题】:Can I use .include?() in a case statement? Ruby 【发布时间】:2017-04-13 14:45:42 【问题描述】:

我已经开始学习 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 语句无法检测到我输入了导航。有没有办法解决这个问题,或者如果我完全不在,有人可以指出我正确的方向吗?

我找到了解决问题的方法,安全可靠吗?

  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

【问题讨论】:

将正则表达式与[]-notation、scanmatch 结合使用。 @sagarpandya82 谢谢。你能给我一个例子来说明这是如何工作的吗?我是这个领域的新手 (listen.include?("navigate")) 等于truefalse,因此如果listen 等于该逻辑值,则执行以下行。那不是你想要的。您需要将case listen 更改为case 正是我需要的。感谢您的解释。如果您将此作为答案,我可以将您的答案标记为解决方案。 listenStringlisten.include?('navigate') 是布尔值。布尔值永远不会等于String,也不会匹配String,因此该分支永远无法执行……对于所有其他分支也是如此。 【参考方案1】:

在你的情况下使用if elsif

if listen.include?("navigate")
  # ...
elsif $player_items.include?(listen)
  # ...
end

【讨论】:

哇反应快!那会工作的,谢谢。我想知道是否有更清洁的方法,因为游戏将来会“听取”更多的输入。因此我选择用例【参考方案2】:

如果你想使用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

【讨论】:

以上是关于我可以在案例陈述中使用 .include?() 吗?红宝石的主要内容,如果未能解决你的问题,请参考以下文章

我可以在案例陈述中使用“AS”关键字吗

选择案例陈述和数据验证

为什么我们需要突破案例陈述?

Verilog 中的案例陈述?

案例表达与案例陈述

使用 2 个不同字段的案例陈述