Я пишу очень простой код, запрашиваю подтверждение при вводе текста, и что я хочу сделать, так это то, что если пользователь просто нажимает «Enter», он засчитывается как «да». Например:
define method
puts "enter some text"
@text= gets.chomp
puts "you entered '#{@text}', is it correct?"
correct = gets.chomp
if correct == 'y' || ''
other_method
else
method
end
end
Но когда я запускаю его на Ruby, я получаю «Предупреждение, буквальная строка в состоянии», и все, что вы вводите, вызывает «other_method». Я нашел следующее решение:
define method
puts "enter some text"
@text= gets.chomp
puts "you entered '#{@text}', is it correct?"
correct = gets.chomp
if correct == 'y'
other_method
elsif correct == ''
other_method
else
method
end
end
Но это довольно неприятно, я бы лучше понял, почему первый не работает, и как мне заставить его работать с помощью | |
Спасибо!
Насколько я могу судить, это не код Ruby. Это def method
, но method
- не очень хорошее название метода, так как уже есть Object#method
, который вы бы взломали.
Ошибка говорит о том, что вы предоставляете строку (литерал) внутри самого условного оператора. Когда вы выполняете if correct == "y" || ""
, вы фактически говорите ему if correct == "y"
ИЛИ ""
, и простая передача строки сама по себе не является условием.
Чтобы исправить это, вам нужно просто указать условие после оператора, а также до него. Ruby не предполагает, что вы хотите, чтобы то же самое произошло после ||
.
Как это:
define method
puts "enter some text"
@text= gets.chomp
puts "you entered '#{@text}', is it correct?"
correct = gets.chomp
if correct == 'y' || correct == ''
other_method
else
method
end
end
Надеюсь это поможет. Удачного кодирования
Спасибо! Это помогло!
Потрясающие. И снова удачного кодирования.
Вот еще один вариант с использованием Регулярное выражение (Документы):
puts "enter some text"
@text= gets.chomp
puts "you entered '#{@text}', is it correct?"
correct = gets.chomp
if /^y?$/ =~ correct # This will match 'y' and empty string both
other_method
else
method
end
Я новичок (некоторые видеоуроки представляют собой все мои знания в области программирования), и ваш ответ привел меня к регулярным выражениям, которые, по-видимому, весьма важны, поэтому я собираюсь немного почитать на эту тему, чтобы улучшить свое кодирование. Большое спасибо!
Приятно слышать. Иди, возьми. :)
В Ruby есть большая разница между ^
и \A
, а также $
и \z
. ^
означает начало строки, а \A
означает начало строки. То же самое касается двух других, условно говоря.
Решение здесь состоит в том, чтобы использовать очень универсальный оператор Ruby case
для настройки ряда «случаев», которые вы хотите протестировать:
puts "you entered '#{@text}', is it correct?"
case (gets.chomp)
when 'y', 'yes', ''
method_a
else
method_b
end
Это можно расширить, чтобы использовать регулярные выражения для еще большей универсальности:
case (gets.chomp)
when /\A\s*y(?:es)?\s*\z/i
method_a
else
method_b
end
Где теперь будет работать что-нибудь вроде "y"
или "yes"
или "Yes "
.
Если у вас есть несколько операторов if
, все тестирующих одну и ту же переменную, подумайте об использовании оператора case
для упрощения вашей логики.
В Ruby мы предпочитаем два пробела для отступов :)