Как исправить «неинициализированную константу List :: Task (NameError)» в Ruby - PullRequest
3 голосов
/ 25 апреля 2019

Вывод: <'class: List'> неинициализированная константа List :: Task (NameError) Вы создали новый список


Я думаю, что происходит, когда я вызываю Task.new,класс List, возможно, ищет метод задачи или переменную в своем собственном классе.

До сих пор я безуспешно пытался использовать include Task и require Task в своем классе List.Я также попытался объявить класс List в моем классе Task.Я также попытался сделать класс списка родителем класса Task.После некоторых копаний в Интернете я подумал, что это версия Ruby, и даже изменил PATH на более старую версию ruby.

class List
    attr_reader :all_tasks
    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
    def initialize
      @all_tasks = []
    end

    def add(task)
        all_tasks << task
    end
end

class Task
  attr_reader :description
  def initialize(description)
    @description = description
  end
end

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Это могло бы помочь, если бы вы предоставили больше информации о том, где (например: в каких файлах) определены классы и как вы вызываете / выполняете свой код 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).

0 голосов
/ 25 апреля 2019
class List
  class Task
    attr_reader :description
    def initialize(description)
      @description = description
    end
  end

  attr_reader :all_tasks
  if __FILE__ == $PROGRAM_NAME

    my_list = List.new
    puts 'You have created a new list'
    List::Task.new('Make breakfest')
    # my_list.add(Task.new('Make breakfest'))
    puts 'You added a task'
  end

  def initialize
    @all_tasks = []
  end

  def add(task)
    all_tasks << task
  end

end
  1. Первая проблема, которая возникла в этом файле, которую мы пытаемся вызвать Task class, прежде чем реализовать!

  2. Вы не правильно позвоните Task класс my_list.add(Task.new('Make breakfest')) правильно это List :: Task.new ('Сделать завтрак')

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