【问题标题】:Ruby - Until loop doesn't seem to be working correctlyRuby - 直到循环似乎无法正常工作
【发布时间】:2023-03-29 06:45:02
【问题描述】:

大家好,我是 Ruby 新手,如果这看起来是一个愚蠢的问题,我很抱歉,只是似乎无法弄清楚我做错了什么。

我一直在努力寻找在线帮助,如果没有写一本关于这个问题的小说,我也不确定要搜索什么。

代码的目的是不断询问用户输入,直到他们输入一个字母,我通过检查用户输入是否在数组“字母表”中来做到这一点,当他们这样做时,它应该检查它是否与“ word”来检查字母是否在我在其他地方随机选择的单词中(我正在尝试编写刽子手,只是为了上下文)

代码如下:

def Check_Alph(word)    
    until $alphabet.include? 'guess' == true 
        puts "Please guess a letter from the alphabet"
        guess = gets.chomp
        puts "#{guess}"
    end 

    if $alphabet.include? 'guess' == true
        puts "valid letter entered, checking.."
        $guessed_Letters << guess
        if word.include? 'guess' == true
            puts "good guess! That letter was in the word!" 
            puts "Letters confirmed to be in word: #{correct_Letters}"          
        end
    end     
end

在控制台中,它只是出现“请从字母表中猜出一个字母”,然后当我输入一个字母时,它只是重新提出问题。我什至尝试输出“猜测”以检查它是否正确获取了值,但并不确定发生了什么。

任何帮助将不胜感激!

编辑:

def Check_Alph()    
    guess == nil
    until $alphabet.include?(guess)
        puts "Please guess a letter from the alphabet"
        guess = gets.chomp
        puts "#{guess}"
    end     
end

【问题讨论】:

  • == true 不仅是多余的。在这个例子中(没有括号)它实际上导致了一个错误,因为== 具有比方法调用更强的绑定。 Ruby 像这样读取该行:$alphabet.include?('guess' == true),显然与$alphabet.include?(false) 相同。而且由于$alphabet 包含字符,这将始终返回false

标签: ruby


【解决方案1】:

有两个问题。

首先变量guess与字符串'guess'不同。但是您检查$alphabet 是否包含字符串,而不是变量的值。

第二个$alphabet.include? 'guess' == true会导致错误,因为==的绑定比方法调用强。 Ruby 像 $alphabet.include?('guess' == true) 这样读取该行。由于'guess' 或变量guess 永远不会等于true,因此它与$alphabet.include? 相同(false)。

正如其他人已经指出的那样,根本不需要检查== true,因为include? 已经返回一个布尔值。

改变

until $alphabet.include? 'guess' == true 

until $alphabet.include?(guess)

此外,您需要在启动 until 块之前定义 guess,否则它将是未知数并引发错误。只需插入

guess = nil

到方法的顶部。

【讨论】:

  • 唯一的问题:guess 设置在 until 块内,所以这将给出一个 NameError
  • 我按照你说的做了(将其编辑到主帖中,以便你看到),我收到一个新错误:“在'Check_Alph'中:未定义的局部变量或方法'猜测'主要: Object (NameError)" 知道它有什么问题吗?既然我一开始就宣布应该没问题,我想
  • @flanelman:请将guess == nil 更改为guess = nil== 检查是否相等,而 = 分配一个值。并且你需要将nil分配给guess来定义局部变量guess
  • 哦,我的错,这就是它的排序。非常感谢您的帮助/解释,我为此苦苦挣扎了很长时间!
【解决方案2】:

循环直到 $alphabet 包含字符串“guess”。 但是在循环中,您不会向 $alphabet 添加任何内容,因此循环永远不会终止并且您的 if 永远不会执行

【讨论】:

  • 更糟。他循环直到$alphabet 包含false。请看我上面的评论。
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2012-05-06
  • 2013-02-17
  • 2017-10-09
  • 2017-08-03
  • 2014-05-02
  • 2011-09-11
  • 2016-02-11
相关资源
最近更新 更多