Мои классы не могут использовать такие методы обуви, как para

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)}" с тем же кодом возврата.

#

Есть ли что-то фундаментальное, что мне не хватает, чтобы я мог это сделать? И могу ли я легко решить проблему с параграфом, поскольку все мои классы содержат способы отображения собственных данных? Я хотел бы скопировать "включить" методы обуви "в начало каждого класса, и готово.

Или мне нужно с самого начала писать с учетом графического интерфейса?

(Информация о моей программе:

Макет представляет собой серию страниц, на которые есть ссылки на боковой панели, с использованием индекса со связанными страницами, скопированными прямо из книги «Никто не знает обувь» или образца учебного пособия.

Студенты могут вводить свои новые уровни и просматривать информацию о своем текущем прогрессе.

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

Выше: студент - это настраиваемый класс с такими методами, как «сохранить», «отобразить сглаженные данные», «добавить один к своему уровню, ЕСЛИ этого ИНАЧЕ нет» и связанными битами данных, такими как массив со всеми объектами их курса. в.

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


person Unmutual    schedule 05.10.2016    source источник
comment
ты уже пробовал мое решение?   -  person peter    schedule 16.10.2016
comment
Похоже, здесь ключевое слово пукает   -  person Shirley Temple    schedule 13.12.2020


Ответы (1)


Рад видеть вопрос про обувь, это было давно. Вы новичок в SO, поэтому сначала: ваш вопрос слишком сложен, слишком много, чтобы читать, и слишком мало информации, чтобы помочь вам. Вам необходимо предоставить фрагмент кода, который выдает ошибку или не выполняет то, что вы ожидаете, то, что мы можем взять на себя и попробовать. Это означает извлечение из вашего кода тестов или фрагментов кода, которые запускаются сами по себе и показывают проблему.

Нам также необходимо знать, какую версию Ruby, а также какую версию и цвет обуви вы используете. В качестве примера я буду использовать зеленые туфли.

Я уверен, что это не совсем то, что вам нужно, но я сделал образец, основанный на вашем описании массива, который должен быть указан как путями, так и параграфами.

Измените вопрос или создайте новый, если это не то, что вам нужно.

require 'green_shoes'

s = Struct.new(:topic, :score)
s1 = s.new("test1", 1)
s2 = s.new("test2", 2)
A = [s1, s2]

class Array
  def putsdata(shoes = nil)
    if shoes.class == Shoes::App
      self.each do |ea|
        shoes.para "#{ea.topic}: #{ea.score}"
      end
    else
      self.each do |ea|
        puts "#{ea.topic}: #{ea.score}"
      end
    end
  end
end

A.putsdata

# gives in the console
# test1: 1
# test2: 2

Shoes.app do
  A.putsdata(self)
end

# gives in a graphic window
# test1: 1
# test2: 2

Put также работает в блоке shoes, но, конечно, результат появляется не в графическом окне, а на консоли, с которой вы начали, после первого списка.

person peter    schedule 05.10.2016