Лучший способ поиска вложенных массивов в Ruby? - PullRequest
0 голосов
/ 21 октября 2018

Для контекста, я пытаюсь решить эту проблему.

  • Программное обеспечение для проверки расписания приема на прием к стоматологу

  • Реализация суперкласса Appointmentи подклассы OneTime, Day и MonthAppointment есть description (например, «Root Canal») и dates информация (вы можете использовать объект Date или int Year, Int Month, Int Day).Заполните массив Appointment объектов смесью встреч.

  • Напишите метод OccursOn внутри каждого из подклассов, который проверяет, происходит ли встреча в эту дату (OneTime), день(День) или месяц (месяц).Попросите пользователя ввести дату для проверки (например, 2006 10 5) и спросите пользователя, хотят ли они проверить встречу OneTime, Day или Month.Основываясь на том, что выбрал пользователь, OccursOn внутри каждого подкласса должен запускаться и отображать любые подходящие встречи и связанные с ними описания.

Это то, что я имею до сих пор.

class Appointment
   attr_accessor :day, :month, :year, :info
   def initialize(day, month, year, info)
     @day = day
     @month = month
     @year = year
     @info = info
   end

   def occursOn

   end
end

class OneTime < Appointment
  def OneTime.occursOn(day, month, year)
    if @day.to_i == day.to_i && @month.to_i == month.to_i && @year.to_i == year.to_i
      puts "Good"
    else
      puts "Not Good"
    end
  end
end

class Day < Appointment
  def Day.occursOn(day)
    if @day.to_i == day.to_i

      puts "Good"
    else
      puts "Not Good"
    end
  end
end

class Month < Appointment
  def Month.occursOn(month)
    if @month.to_i == month.to_i
      puts "Good"
    else
      puts "Not Good"
    end
  end
end

app1 = OneTime.new("10", "11", "2018","Root Canal")
app2 = Day.new("10", "11", "2018", "Root Canal")
app3 = Month.new("10", "11", "2018", "Root Canal")
app4 = OneTime.new("11", "11", "2018", "Cleaning")
app5 = Day.new("11", "11", "2018", "Cleaning")
app6 = Month.new("11", "11", "2018", "Cleaning")
a = Array.new
a << app1 << app2 << app3 << app4 << app5 << app5 << app6



puts "Please enter the day of the appointment that you would like to search for"
day = gets.chomp
puts "Please enter the month of the appointment that you would like to search for"
month = gets.chomp
puts "Please enter the year of the appointment that you would like to search for"
year = gets.chomp


puts "Enter a number 1-3 to choose an answer out of OneTime, Day, or Month to search in that catagory respectivly"
answer = gets.chomp
if answer == "1"
  OneTime.occursOn(day, month, year)
elsif answer == "2"
  Day.occursOn(day)
elsif answer =="3"
  Month.occursOn(month)
else
  puts "Wrong answer"
end

Я пытаюсь проверить, совпадают ли введенные пользователем значения «день», «месяц» и «год» с числами в каждом из значений массива, которые соответствуют методу, введенному пользователем.Таким образом, OneTime.OccursOn должен выполнять поиск только в массивах, созданных с помощью OneTime.new.Я не могу использовать .include?из-за возможности того же значения дня и месяца.

Это выглядит полезным, но я не знаю, как бы я реализовал что-то подобное с моими подклассами.

array = [
  ["A", "X"],
  ["B", "Y"],
  ["C", "Z"]
]


str = "Y"
arr = array.find{|a| a[1] == str}
puts arr[0] if arr
# => B

Буду признателен за любую помощь.Спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

Вот пример кода для достижения того, что вы хотите (при условии, что вы правильно поняли ваше намерение).Я использую имя метода occursOn (обратите внимание, что в Ruby первый символ имени метода должен быть строчным алфавитом ).

class Day < Appointment
  def occursOn(day)
    if @day.to_i == day.to_i  # Compares as integers
      puts "Good"
    else
      puts "Not Good"
    end
  end
end

Затем пример теста:

app2 = Day.new("10", "11", "2018", "Root Canal")
app2.occursOn(10)   # => printing "Good"
app2.occursOn(999)  # => printing "not Good"

Описание

Использовать метод экземпляра, а не метод класса, такой как def Day.occursOn(day).В Ruby, когда вызывается метод (instance), метод имени в классе экземпляра имеет наивысший приоритет, и поэтому методы с тем же именем в его родительском или родительском классах игнорируются.

Это один из основных принципов в Ruby.Я рекомендую вам прочитать раздел Классы в учебниках по Ruby, например, Программирование на Ruby (бесплатно онлайн).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...