You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby石头剪刀布游戏出现undefined method `include?' for nil报错问题

报错根因

  • gets 方法获取的用户输入默认携带末尾的换行符 \n,你直接调用 capitalize 处理后,@guess 的值会是类似 "Rock\n" 而不是预期的 "Rock",转成符号后和 rule_engine 里的键不匹配,取到的值为 nil,调用 include? 就抛出了空对象异常。
  • 你在 winner_is 方法里多次调用 sys_guess,每次调用都会重新随机生成系统出拳,打印的出拳和实际判断逻辑用的出拳不是同一个值,会导致运行结果和打印内容不符。

修复方案

  1. 处理用户输入时调用 chomp 方法去掉末尾的换行符
  2. 把 sys_guess 的单次运行结果存到本地变量复用,避免多次调用重复生成随机值
  3. 可删除 sys_guess 方法里无用的 rand 12345 语句

修复后的完整代码如下:

class RPS
  def initialize(guess:)  
    # 加chomp去掉末尾换行符
    @guess = guess.chomp.capitalize
  end        

  def rule_engine 
    {
      Rock: ['Scissors'],
      Paper: ['Rock'],
      Scissors: ['Paper']
    }
  end

  def sys_guess
    sys_guesses = %w{Rock Paper Scissors}
    sys_guesses.sample
  end

  def winner_is 
    # 存到本地变量,仅生成一次系统出拳
    current_sys_guess = sys_guess
    puts current_sys_guess
    puts @guess

    if rule_engine[current_sys_guess.to_sym].include? @guess
      puts "Computer wins"
    elsif rule_engine[@guess.to_sym].include? current_sys_guess
      puts "You win!"
    else
      puts "Tie"
    end
  end
end

rps = RPS.new(guess: gets)
rps.winner_is

内容的提问来源于stack exchange,提问作者Lazlo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:36:01