Это могло бы помочь, если бы вы предоставили больше информации о том, где (например: в каких файлах) определены классы и как вы вызываете / выполняете свой код ruby.
Обычно вы помещаете код в каталог lib
, с одним классом на файл и строгой семантикой (class List
входит в lib/list.rb
), но это немного сложнее, чем это.
Если вы хотите взломать и научиться немного играть с ruby, также вполне понятно, что вы не хотите справляться с require
загрузкой (загрузкой) других файлов, работой с зависимостями и всем этим (хотя это и будет должно произойти в один прекрасный день, как и в большинстве других языков программирования).
На данный момент это исправит вашу проблему и поможет вам:
# file name: task_list_program.rb (or anything you want)
class Task
attr_reader :description
def initialize(description)
@description = description
end
end
class List
attr_reader :all_tasks
def initialize
@all_tasks = []
end
def add(task)
all_tasks << task
end
end
# note that for playing around in a single file, you actually
# do not even need the 'if ...' part here
if __FILE__ == $PROGRAM_NAME
my_list = List.new
puts 'You have created a new list'
my_list.add(Task.new('Make breakfest'))
puts 'You added a task'
end
Основной «трюк» здесь состоит в том, чтобы убрать вещь if __FILE__ == ...
из определения вашего класса, потому что в противном случае (вы случайно имеете дело с особым случаем здесь), вещи, оцениваемые в этом классе во время выполнения, не смогут выбрать и ссылаться на другие «определения» так, как вы, кажется, ожидаете.
Надеюсь, это поможет вам начать. Различия между примером кода могут многому вас научить, например, насчет "пространств имен" (которые на самом деле не являются настоящей концепцией в Ruby), но я считаю, что этот короткий ответ достаточно хорош, чтобы вы начали, и повеселитесь с ruby (и, кстати, добро пожаловать в SO) !
(«выполнить» файл следующим образом: ruby task_list_program.rb
).