2016-10-17 6 views
1

Я пытаюсь использовать переменную объекта в массиве для сравнения с пользовательским вводом, чтобы узнать, есть ли у них встреча в этом месяце. При запуске я получаю неопределенную ошибку метода за месяц после a [i]. Есть ли способ вызвать атрибуты, которые я перечислил?Почему я не могу использовать эту переменную?

class Month < Appointment 
    attr_accessor :des, :day, :month, :year 

    class << self 
    def occurOn2(a,uDay, uMonth, uYear) 
     appts = 0 

     for i in (0..10) do 
     if a[i].month == uMonth 
      puts "You're #{a[i].des} is scheduled for this month #{a[i].month} " 
      appts =+ 1 
     end 
     end 
     if appts < 1 
     puts "You do not have any appointments at this time." 
     end 
    end 
    end 
end 
+0

Пожалуйста, прочтите «[mcve]». Вам нужно показать, как вызывается код. Я также предлагаю использовать правильный отступ. Это сделает ваш код более читабельным и более удобным. –

+0

Да, мои извинения, у меня длинный список кода, поэтому подумал, что просто отправить часть, с которой я столкнулся, будет достаточно, но я не дал правильного объяснения. UDay, uMonth и т. Д. Введены пользователем, чтобы увидеть, есть ли что-то противоречащее дате. –

+0

Я поместил все назначения в массив и хотел перекрестно проверить их с помощью ввода пользователя, за исключением того, что я получаю сообщение об ошибке для неопределенного метода при попытке получить месяц от объекта в массиве. –

ответ

0

Ваш код может использовать рефакторинг (10 кажется «магическое число»), но я думаю, что это ошибка, которую вы говорите о том, можно решить с помощью простой проверки нулевой.

for i in (0..10) do 
    if a[1] # or "if defined?(a[1].month)" if you want to be more specific 
     if a[i].month == uMonth 
     puts "You're #{a[i].des} is scheduled for this month #{a[i].month} " 
     appts =+ 1 
     end 
    end 
end 
+0

Также 'for' не рекомендуется в Ruby. '10.times do | i |' выполнил бы то же самое без утечки 'i' и был бы идиоматичным. –

Смежные вопросы