Введите без ввода как допустимое логическое значение

Я пишу очень простой код, запрашиваю подтверждение при вводе текста, и что я хочу сделать, так это то, что если пользователь просто нажимает «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 мы предпочитаем два пробела для отступов :)

Sagar Pandya 01.05.2018 16:43

Насколько я могу судить, это не код Ruby. Это def method, но method - не очень хорошее название метода, так как уже есть Object#method, который вы бы взломали.

tadman 02.05.2018 02:03
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
2
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ошибка говорит о том, что вы предоставляете строку (литерал) внутри самого условного оператора. Когда вы выполняете 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

Надеюсь это поможет. Удачного кодирования

Спасибо! Это помогло!

Andres Pérez 01.05.2018 14:41

Потрясающие. И снова удачного кодирования.

L_Church 01.05.2018 14:42

Вот еще один вариант с использованием Регулярное выражение (Документы):

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

Я новичок (некоторые видеоуроки представляют собой все мои знания в области программирования), и ваш ответ привел меня к регулярным выражениям, которые, по-видимому, весьма важны, поэтому я собираюсь немного почитать на эту тему, чтобы улучшить свое кодирование. Большое спасибо!

Andres Pérez 01.05.2018 15:04

Приятно слышать. Иди, возьми. :)

Jagdeep Singh 01.05.2018 15:06

В Ruby есть большая разница между ^ и \A, а также $ и \z. ^ означает начало строки, а \A означает начало строки. То же самое касается двух других, условно говоря.

tadman 02.05.2018 02:07

Решение здесь состоит в том, чтобы использовать очень универсальный оператор 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 для упрощения вашей логики.

Другие вопросы по теме