Ruby石头剪刀布游戏出现undefined method `include?' for nil报错问题
报错根因
gets方法获取的用户输入默认携带末尾的换行符\n,你直接调用capitalize处理后,@guess的值会是类似"Rock\n"而不是预期的"Rock",转成符号后和rule_engine里的键不匹配,取到的值为nil,调用include?就抛出了空对象异常。- 你在
winner_is方法里多次调用sys_guess,每次调用都会重新随机生成系统出拳,打印的出拳和实际判断逻辑用的出拳不是同一个值,会导致运行结果和打印内容不符。
修复方案
- 处理用户输入时调用
chomp方法去掉末尾的换行符 - 把
sys_guess的单次运行结果存到本地变量复用,避免多次调用重复生成随机值 - 可删除
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
相关产品推荐
相关产品推荐

