2016-10-05 8 views
1

Tldr: как я могу включить методы Обучения в класс Array и классы, созданные с минимальным кодом, без полной перестройки всего?Мои классы не могут использовать методы Обучения, такие как para

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

У меня возникла проблема, описанная в начале руководства. Shoes.app - это своего рода блок сам по себе, поэтому само это всегда относится к нему, а методы обуви, такие как «пара», не обязательно будут доступный везде, где «помещает», находится в Ruby. Но я недостаточно умен, чтобы это исправить (я только что обнял себя и вернулся в чистый рубин, неся со мной)

Например, я создал новый метод для Array: putdata , который перебирает массив результатов теста учащихся, каждый из которых автоматически отображается в виде списка:

self.each do |ea| 
    puts/para "#{ea.topic}: #{ea.score}" 
end 

Работы в рубине. Не работает в обуви. Класс Array не имеет доступа к методу para. Я пробовал:

  • решений массива < обувь (это действительно не нравится, что)
  • добавление stack.app не делают ... конец в различных местах в программе (не влияет)
  • пытается для вызова Shoes :: para вместо para (farts)
  • Я попытался использовать файл require со всеми моими классами и методами in.rb вместо того же кода в файле (не сообщает метод для класса)
  • попробовал выполнить мой код непосредственно перед вызовом метода, чтобы обеспечить, чтобы мой код находился в области обуви (не сообщает метод для класса)
  • сделать мои собственные классы (курс и студент) < обувь, так что бы иметь доступ к его методам (вызывает ошибку времени выполнения)

Я получил его функционировать по: 1. Удаление этого бит кода из класса Array и делает его плавающим/обобщенным методом, а не методом Array 2. Ошибка частного метода -> затем перефразируйте его, а вместо метода Array (array.putdata) это общий метод, который принимает массив в качестве аргумента (putdata (array))

Но я действительно, действительно не хочу проходить через свой код и индивидуально его не организовывать.

Это моя первая программа с 1000 линиями, с 42 методами, и я много работал над тем, чтобы сделать ее максимально удобной и аккуратной, со всем, что скрывалось в классах или методах для удобства обслуживания. Я получил это от всего, в массивных, поэтапных общих методах вплоть до множества быстрых, которые казались немного более похожими на то, как должен идти ООП. Теперь единственный способ, с помощью которого я могу сделать эту работу, - это UN-OOP, и не имеет методов класса или чего-то еще.

Я надеялся, что смогу Обучить программу довольно плавно из этого опрятного функционального back-end: в программе Ruby есть много «если строка ==« SAVE », save (student); else ...», поэтому Я надеялся, что вы просто нажмите «button.click {save (student)}» с тем же обратным кодом.

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

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

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

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

Студенты могут вводить свои новые уровни и просматривать показания их текущего прогресса.

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

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

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

+0

Вы уже пробовали мое решение? – peter

ответ

0

Я рад видеть вопрос о обуви, это было давно. Вы новичок в 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 

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

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

  • Нет связанных вопросов^_^