#ruby #class #if-statement #conditional-statements #attr-accessor
#ruby #класс #if-statement #условные операторы #attr-средство доступа
Вопрос:
Я пытаюсь создать класс ruby с методом, который учитывает возраст. В то время как метод if elsif работает для получения 100 плодов для деревьев старше 5 лет и младше 10. Любое дерево старше 10 и менее 15 лет должно выдавать 200, но этого не происходит?
def grow_fruits
if @age <= 5
@fruits = 0
elsif @age < 10
@fruits = 100
elsif @age < 15
@fruits = 200
else
@fruits = 0
end
end
Я устал @age <= 10 amp;amp; @ < 15, но ответа нет?
Комментарии:
1. Вам нужно указать в своем вопросе конкретное значение для
@age
и то, что@fruits
установлено для этого значения, а также описать, что вы ожидаете вместо этого в качестве значения@fruits
.
Ответ №1:
Похоже, ваш код работает правильно:
# additional set variables before your code
@age=0
@fruits=0
# your code
def grow_fruits
if @age <= 5
@fruits = 0
elsif @age < 10
@fruits = 100
elsif @age < 15
@fruits = 200
else
@fruits = 0
end
end
результат тестирования:
2.7.2 :015 > grow_fruits
=> 0
2.7.2 :016 > @age=10
=> 10
2.7.2 :017 > grow_fruits
=> 200
2.7.2 :018 > @age=14
=> 14
2.7.2 :019 > grow_fruits
=> 200
2.7.2 :020 > @age=9
=> 9
2.7.2 :021 > grow_fruits
=> 100
лично я ненавижу использовать переменные экземпляра в виде «глобальной переменной» и хотел бы передать проверяемое число:
def grow_fruits(age=0)
# remember triple-dots exclude the end value, useful for float comparison
case age
when 5...10
100
when 10...15
200
else
0
end
end
тестирование:
2.7.2 :035 > grow_fruits(0)
=> 0
2.7.2 :036 > grow_fruits(10)
=> 200
2.7.2 :037 > grow_fruits(14)
=> 200
2.7.2 :038 > grow_fruits(9)
=> 100
2.7.2 :039 > grow_fruits(21)
=> 0
если вы действительно хотите установить переменную экземпляра @fruits
, вам было бы лучше сделать это:
@fruits = grow_fruits(@age)
Комментарии:
1.
@fruits
является переменной экземпляра.$fruits
будет глобальной переменной.2. хотя вы технически правы, по сути, это одно и то же за пределами определения. оба используются глобально
3. Хорошее предложение, но есть несколько легко устраняемых проблем. Во-первых, и это самое главное,
@grow_fruits(5)
неверно. (Вам нужноwhen -Float::INFINITY..5 then 0
как первоеwhen
.). Во-вторых, вы не знаете, что@age
это целое число. Я предлагаюwhen 5...9
иwhen 10...14
(три точки). В-третьих, я предлагаю заменитьif you really...this:
наThen:
. (Как уже отмечалось,@fruits
является переменной экземпляра)…4. … В-четвертых, перед
def grow_fruits (age=1)
этим обычно не должно быть пробелов(
, и нет причин иметь значение по умолчанию). Наконец, я бы заменил все перед этой строкой на «Если вы повторно запустите свой код, вы обнаружите, что он работает правильно». То, что у вас сейчас есть, ничего не добавляет.5. @cary в ответ на «в-четвертых» он добавляет 2 маленькие строки чуть выше, устанавливая переменные экземпляра, поскольку у меня есть подозрение, что они отсутствовали, когда он тестировал.