Я пытаюсь понять, как вызывать методы внутри методов в ruby.
Вот мой код:
def testNegative number
if number < 0 # No negative numbers.
return 'Please enter a number that isn\'t negative.'
end
end
def testIfZero number
if number == 0
return 'zero'
end
end
def englishNumber number
testNegative(number)
testIfZero(number)
end
puts englishNumber -1
puts englishNumber 0
В настоящее время я получаю пустую строку, а затем "ноль". Мне было интересно, почему я не вижу «Пожалуйста, введите неотрицательное число» в качестве результата команды put englishNumber -1. Как я могу исправить ситуацию, чтобы возвращалось сообщение «Пожалуйста, введите не отрицательное число» и программа завершалась?
2 ответа
В своем ответе я буду использовать подчеркивания вместо верблюжьего регистра, потому что это то, что люди обычно делают для методов Ruby.
Ваш код сейчас не работает, потому что test_negative
возвращает значение, но english_number
ничего не делает со значением. Вы можете изменить english_number
на:
def english_number(number)
test_negative(number) or test_if_zero(number)
end
Таким образом, если test_negative
возвращает значение, отличное от нуля и не ложное, то english_number
будет использовать его в качестве возвращаемого значения и не беспокоиться о запуске test_if_zero
.
Позже, если вам понадобится добавить больше строк кода в english_number
, вы можете сделать это следующим образом:
def english_number(number)
error_message = test_negative(number) || test_if_zero(number)
return error_message if error_message
# More lines of code here
end
Кстати, похоже, что вы действительно можете захотеть использовать исключения. Когда вы вызываете исключение, программа завершается, и сообщение об исключении будет напечатано пользователю, если вы не сделаете что-то для перехвата и обработки исключения. Я бы изменил test_negative
на:
def test_negative(number)
if number < 0 # No negative numbers.
raise 'Please enter a number that isn\'t negative.'
end
end
Ваш код
def englishNumber number
testNegative(number)
testIfZero(number)
end
Сначала вызывает testNegative(number)
и игнорирует результат.
Затем он вызывает testIfZero(number)
и возвращает результат вызывающей стороне.
Для englishNumber -1
результат testIfZero(number)
равен нулю, а puts
записывает пустую строку.
Для englishNumber 0
вы получите ожидаемую строку 'zero'
.
Если вам нужны результаты в качестве альтернативы, вы должны вернуть результаты с условием or
(или ||
).
Полный пример:
def testNegative number
if number < 0 # No negative numbers.
return 'Please enter a number that isn\'t negative.'
end
end
def testIfZero number
if number == 0
return 'zero'
end
end
def englishNumber number
testNegative(number) or testIfZero(number)
end
puts englishNumber -1
puts englishNumber 0
Или с альтернативным синтаксисом:
def testNegative number
return 'Please enter a number that isn\'t negative.' if number < 0 # No negative numbers.
end
def testIfZero number
return 'zero' if number == 0
end
def englishNumber number
testNegative(number) || testIfZero(number)
end
puts englishNumber -1
puts englishNumber 0
Я не уверен, правильно ли я понимаю ваши комментарии, но, возможно, вы ищете такое решение:
def testNegative number
puts 'Please enter a number that isn\'t negative.' if number < 0 # No negative numbers.
end
def testIfZero number
puts 'zero' if number == 0
end
def englishNumber number
testNegative(number)
testIfZero(number)
end
englishNumber -1
englishNumber 0
Команду puts
также можно использовать внутри методов, вам не нужно возвращать результат.
Замечание, выходящее за рамки вопроса: использование вызова метода внутри метода - не самое простое решение (но я думаю, вы хотите проверить использование вызовов методов).
Я хотел бы использовать:
def english_number number
if number < 0 # No negative numbers.
return 'Please enter a number that isn\'t negative.'
elsif number == 0
return 'zero'
end
end
Похожие вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].