2014-02-04 1 views
5

Всякий раз, когда я пытаюсь запустить программу, появляется сообщение об ошибке «Строковый литерал в состоянии (в строке 10)». Что я делаю не так?Что означает «строковый литерал в состоянии»?

puts "Welcome to the best calculator there is. Would you like to (a) calculate the area of a geometric shape or (b) calculate the equation of a parabola? Please enter an 'a' or a 'b' to get started." 
response = gets.chomp 

if response == "a" or "A" 

     puts "ok." 

elsif response == "b" or "B" 

     puts "awesome." 

else 

     puts "I'm sorry. I did not get that. Please try again." 

end 
+4

Проблема не в том, что она находится на линии 10 в пределах того, что вы опубликовали. Если вы отправляете что-то отличное от кода, который вы запускаете для получения сообщения, тогда бесполезно писать '(on line 10)'. Не пишите такие путаные вещи. – sawa

ответ

15

Вы должны указать полное состояние с обеих сторон or.

if response == "a" or response == "A" 

Обе стороны or не связаны; Ruby не делает никаких предположений о том, что находится справа, исходя из того, что находится слева. Если правая сторона является пустой строкой "A", ну, ничего, кроме false или nil считается «истиной», поэтому все выражение оценивается как «истина» все время. Но Ruby замечает, что это строка, а не логическое значение, подозревает, что вы, возможно, не указали, что вы имели в виду, и поэтому выдает предупреждение в вопросе.

Вы также можете использовать выражение case, чтобы упростить выполнение нескольких тестов по одному значению; если вы предоставить список из нескольких возможностей в одном when, они эффективно or объединены:

case response 
    when "a","A" 
    puts "ok" 
    when "b","B" 
    puts "awesome." 
    else 
    puts "I'm sorry. I did not get that. Please try again." 
end 

Для конкретной ситуации игнорирования алфавитного случая, вы также можете просто конвертировать в верхнем или нижний перед тестированием:

case response.upcase 
    when "A" 
    puts "ok" 
    when "B" 
    puts "awesome." 
    else 
    puts "I'm sorry, I did not get that. Please try again." 
end 
2

Это не так синтаксически; это неправильно в том смысле, что оно бесполезно. Выражение response == "a" or "A" интерпретируется как (response == "a") or "A", что всегда является правдивым из-за "A", поэтому бесполезно ставить его в состояние.

2

if response == "a" or "A" равнозначно if (response == "a") or "A". А «А» - строковый литерал, поэтому жалуется рубиновый интерпретатор.

2

Это не ошибка, это предупреждение.

Вы есть условие

response == "a" or "A" 

Ну, response == "a" является либо true или false. Если это true, условие сводится к

true or "A" 

которая

true 

Если это false, условие сводится к

false or "A" 

которая

"A" 

который правша, так как все кроме false и nil правдиво.

Таким образом, независимо от содержания response, состояние будет всегда быть правдой.

И вот что предупреждает вас предупреждение: строковые литералы всегда правдивы, просто не имеет смысла использовать их в состоянии.

 Смежные вопросы

  • Нет связанных вопросов^_^