Я пытаюсь понять, как вызывать методы внутри методов в 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. Как я могу исправить ситуацию, чтобы возвращалось сообщение «Пожалуйста, введите не отрицательное число» и программа завершалась?

0
Gwater17 25 Апр 2016 в 23:25

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
1
David Grayson 26 Апр 2016 в 03:45

Ваш код

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
0
knut 25 Апр 2016 в 22:04