Почему мои операторы if и els-if в моем методе ruby не будут работать

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