如何在Ruby中修复“未初始化的常量List :: Task(NameError)”

时间:2019-04-24 21:04:51

标签: ruby

输出:<'class:List'>未初始化的常量List :: Task(NameError) 您创建了一个新列表


我认为正在发生的事情是,当我调用Task.new时,List类正在其自己的类中寻找任务方法或变量。

到目前为止,我在自己的List类中尝试使用include Taskrequire Task的过程并不顺利。我还尝试在Task类中声明List类。我还尝试使列表类成为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 :(得分:0)

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类!

  2. 您不正确呼叫Taskmy_list.add(Task.new('Make breakfest')) 正确的是List :: Task.new('Make breakfast')

答案 1 :(得分:0)

如果您提供有关类的定义位置(例如:在哪些文件中)以及如何调用/执行红宝石代码的更多信息,这可能会有所帮助。

通常,您将代码放置在lib目录中,每个文件具有一个类并且具有强大的语义(class List进入lib/list.rb),但是比这稍微复杂一点

如果您想闲逛并学习红宝石的演奏,那也是完全可以理解的,您不想处理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中afaik并不是一个真正的概念),但我相信这个简短的答案足以让您入门,并且与ruby玩得开心(顺便欢迎SO的到来)!

(“执行”这样的文件:ruby task_list_program.rb)。