TLDR: как мне «включить методы обуви» в класс Array и созданные мной классы с минимальным кодом, без полной реструктуризации всего?
Я написал работающую программу на Ruby, и теперь я хочу сделать из нее приложение Shoes.
У меня проблема, описанная в начале руководства - Shoes.app сам по себе является своего рода блоком, поэтому self всегда ссылается на него, а методы Shoes, такие как "para", не обязательно будут доступны везде. "put" находится в Ruby. Но я недостаточно умен, чтобы это исправить (я только что начал использовать self и вернуться на чистом Ruby, терпите меня)
Например, я создал новый метод для Array: putdata, который просматривает массив результатов теста студента, автоматически отображая каждый в виде списка:
self.each do |ea|
puts/para "#{ea.topic}: #{ea.score}"
end
Работает в рубине. Не работает в Shoes: класс Array не имеет доступа к методу para. Я пробовал:
- создание Array ‹Shoes (это действительно не нравится)
- добавление stack.app do ... end в разных местах программы (без влияния)
- пытаюсь вызвать Shoes :: para вместо para (пукает)
- Я пробовал использовать require 'file со всеми моими классами и методами в.rb' вместо того же кода в файле (не сообщает о методе для класса)
- пытался запросить мой код непосредственно перед вызовом метода, чтобы убедиться, что мой код находится в области Shoes (не сообщает о методе для класса)
- создание моих пользовательских классов (курс и студент) ‹обувь, чтобы он имел доступ к своим методам (вызывает ошибку времени выполнения)
Я заставил его работать следующим образом: 1. Удалив этот фрагмент кода из класса Array и сделав его плавающим / универсальным методом, а не методом Array 2. Ошибка частного метода -> затем перефразируя его так, вместо Array метод (array.putdata) это общий метод, который принимает массив в качестве аргумента (putdata (array))
Но я очень, очень не хочу повторять свой код и индивидуально его неорганизовывать вот так.
Это моя первая 1000-строчная программа с 42 методами, и я много работал над тем, чтобы сделать ее максимально удобной и аккуратной, чтобы все было спрятано в классах или методах для облегчения обслуживания. Я получил это от всего, от массивных, пошаговых универсальных методов до множества быстрых, которые казались немного больше похожими на то, как задумано ООП. Теперь единственный способ, которым я могу выполнить эту работу, - это UN-OOP, и не иметь никаких методов класса или чего-то еще.
Я надеялся, что смогу довольно легко обойти программу из этого аккуратного, функционального бэкенда: программа Ruby имеет много "if string ==" SAVE ", save (student); else ...", поэтому я надеялся просто введите "button.click {save (student)}" с тем же кодом возврата.
#Есть ли что-то фундаментальное, что мне не хватает, чтобы я мог это сделать? И могу ли я легко решить проблему с параграфом, поскольку все мои классы содержат способы отображения собственных данных? Я хотел бы скопировать "включить" методы обуви "в начало каждого класса, и готово.
Или мне нужно с самого начала писать с учетом графического интерфейса?
(Информация о моей программе:
Макет представляет собой серию страниц, на которые есть ссылки на боковой панели, с использованием индекса со связанными страницами, скопированными прямо из книги «Никто не знает обувь» или образца учебного пособия.
Студенты могут вводить свои новые уровни и просматривать информацию о своем текущем прогрессе.
Существуют общие методы для основных «частей» программы, которые имеют такие вещи, как заголовок страницы и некоторые инструкции, и которые затем вызывают объекты ученика или методы модуля для выполнения действий в соответствии с инструкциями пользователя.
Выше: студент - это настраиваемый класс с такими методами, как «сохранить», «отобразить сглаженные данные», «добавить один к своему уровню, ЕСЛИ этого ИНАЧЕ нет» и связанными битами данных, такими как массив со всеми объектами их курса. в.
Каждый курс также является настраиваемым классом («Модуль»), который имеет оценку, имя модуля и т. Д. В качестве переменных, а также некоторые крошечные методы, такие как отображение отформатированного имени или добавление одного к этому модулю.)