2016-11-11 4 views
0

Эй, ребята, я новичок в Ruby, так что извиняюсь, если это кажется глупым вопросом, просто не могу понять, что я сделал неправильно.Ruby - До тех пор, пока петля не работает правильно

Я изо всех сил пытаюсь найти онлайн-помощь, не совсем уверен, что искать, не пиши роман о проблеме.

Целью кода является то, что он должен просить пользователя вводить данные, пока они не введут букву. Я делаю это, проверяя, находится ли вход пользователя в массиве «алфавит», и когда он это делает, он должен проверить его «слово», чтобы проверить, если письмо в слово, которое я случайно выбрать в другом месте (я пытаюсь код палач, только для связи)

вот код:

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 

в консоли это просто появляется «Пожалуйста, угадайте письмо из алфавита», затем, когда я ввожу письмо, он просто спрашивает вопрос. Я даже попробовал вывести «угадать», чтобы проверить, правильно ли оно получило значение, и это было не совсем точно, что происходит.

Любая помощь была бы принята с благодарностью!

Edit:

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

«== true» не только лишний. В этом примере (без круглых скобок) это фактически приводит к ошибке, потому что '==' имеет более сильное связывание, чем вызов метода. Ruby читает эту строку следующим образом: '$ alphabet.include? ('Guess' == true)', что, очевидно, совпадает с '$ alphabet.include? (False)'. А поскольку '$ alphabet' содержит символы, это всегда будет возвращать' false'. – spickermann

ответ

1

Есть две проблемы.

Сначала переменная guess не совпадает с строкой 'guess'. Но вы проверяете, включает ли $alphabet строку, а не значение переменной.

Второй $alphabet.include? 'guess' == true приводит к ошибке, поскольку == имеет более сильное связывание, чем вызов метода. Рубин читает эту строку $alphabet.include?('guess' == true). Поскольку 'guess' или переменная guess никогда не будет равна true, это то же самое, что и $alphabet.include? (false).

Как уже указывалось, нет необходимости проверять на наличие == true, так как include? уже возвращает логическое значение.

Изменить

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

в

until $alphabet.include?(guess) 

Кроме того, нужно будет определить guess, прежде чем начать until блок, в противном случае это будет неизвестно и вызвать ошибку. Просто вставьте

guess = nil 

в начало вашего метода.

+0

Только проблема: 'guess' установлен в блоке' until', поэтому это даст 'NameError'. – Stefan

+0

Я сделал то, что вы сказали (отредактировал его в главном сообщении, чтобы вы могли видеть), и я получаю новую ошибку: "in 'Check_Alph': неопределенная локальная переменная или метод 'guess' для main: Object (NameError)" Любая идея, что в этом плохого? Поскольку я объявил это с самого начала, это должно быть хорошо, я подумал, что – flanelman

+0

@flanelman: Пожалуйста, измените 'guess == nil' на' guess = nil'. '==' проверяет, если что-то равно, тогда как '=' присваивает значение. И вам нужно назначить 'nil'' guess' для определения локальной переменной 'guess'. – spickermann

1

You петля до $ алфавит не содержит строку "угадать". Но в цикле вы ничего не добавляете к алфавиту $, поэтому цикл никогда не может завершиться, и ваш, если он никогда не сможет выполнить

+0

Еще хуже. Он пеет, пока '$ alphabet' не включит' false'. Пожалуйста, см. Мой комментарий выше. – spickermann