Ruby script игнорирует условный и прерывает метод без ошибок

#ruby #conditional-statements

#ruby #условные операторы

Вопрос:

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

 class String

    def is_number?
    
        puts "Here it's working, 1"
    
        if self.scan(/D/).empty? and self != ""
            return true
            puts "true"
        else
            return false
            puts "false"
        end
        
        puts "Here it's working, 2"
    end
    
end

"asd".is_number?
puts "Here it's working, 3"
  

Результат для меня довольно удивительный:

Результат

Метод работает до тех пор, пока не будет выполнено условие. На этом этапе он не соответствует параметрам «тогда» или «еще» (которые до сегодняшнего дня я тоже никогда не считал опцией), а вместо этого прерывает метод. Затем он переходит к следующей команде. Наконец, в конце программы он остается там без каких-либо ошибок.

Я, честно говоря, не знаю, как поступить на этом этапе.

Ответ №1:

Когда вы используете return метод, он не будет выполнять какой-либо код после этого, если вы ожидаете true / false для печати, вы должны поместить его над return оператором

 def is_number?
  puts "Here it's working, 1"
  if self.scan(/D/).empty? and self != ""
    puts "true"
    return true
  else
    puts "false"
    return false
  end   
  puts "Here it's working, 2"
end
  

Примечание: — "Here it's working, 2" оператор никогда не будет выполняться, так как перед этим будет return оператор.

Ответ №2:

он не соответствует параметрам «тогда» или «еще»

Нет, это не то, что здесь происходит, как описано в ответе от Salil.

На будущее, если вы формулируете гипотезу о своем коде, вы должны доказать или опровергнуть ее. Не для нас, для себя. Иначе откуда вы знаете, что это на самом деле происходит?

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

 if self.scan(/D/).empty? and self != ""
  #return true
  #puts "true"
  raise "error from if branch"
else
  #return false
  #puts "false"
  raise "error from else branch"
end