【问题标题】:How to fix "uninitialized constant List::Task (NameError)" in Ruby如何在 Ruby 中修复“未初始化的常量 List::Task (NameError)”
【发布时间】:2019-04-25 06:37:01
【问题描述】:

输出: 未初始化的常量 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

【问题讨论】:

  • 仔细查看您的代码:您在代码中的哪个位置尝试实例化Task?你在什么时候定义Task?这两点中的哪一点先于另一点?这说明了什么问题?

标签: ruby


【解决方案1】:

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

通常,您会将代码放在lib 目录中,每个文件一个类和强语义(class List 进入lib/list.rb),但它比这稍微复杂一点。

如果你想玩转 ruby​​ 并学习玩一点,这也是完全可以理解的,你不想处理 requireing (加载)其他文件,处理依赖关系等等(尽管这会与大多数其他编程语言一样,总有一天会发生)。

目前,这将解决您的问题,应该可以帮助您:

# 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__ == ... 从你的类定义中移出,因为否则(你在这里不小心处理了一个特殊情况),在运行时在该类中评估的东西将无法选择并以您似乎期望的方式引用其他“定义”。

我希望这可以帮助您继续前进。代码示例之间的差异可以教给您很多东西,例如关于“命名空间”(afaik 在 Ruby 中不是一个真正的概念),但我相信这个简短的答案足以让你开始并玩 ruby​​ 一些乐趣(顺便欢迎在 SO )!

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

【讨论】:

    【解决方案2】:
    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('做早餐')

    【讨论】:

    • 你是怎么测试的?请显示您的错误! P.S 如果您通过 Rails 控制台进行测试,您需要在更新类后重新启动控制台!!
    • 我使用了 Visual Studio 代码和 sublime text 来运行它。在尝试了您的解决方案后,即使我将您的解决方案粘贴到一个新文件并在那里进行测试,我也得到了同样的错误。
    • 当我尝试通过命令提示符以及“ruby todo.rb”运行这两个文件时发生了同样的事情我尝试同时使用 ruby​​ 2.2 和 2.6 版
    • 谢谢。我对在这个网站上发帖还是很陌生,对粗鲁的投票感到抱歉。感谢您的耐心和努力帮助我。
    • @AndriyKondzolko 我非常感谢您的努力 Andriy(对原始记者也非常敏感,很好 - 即使它被否决了!),但是没有 cmets 的纯代码答案并不总是有帮助堆栈溢出答案。也许您可以合并一些文本(仅几句话,例如您对 rails 控制台的评论或您如何执行发布的代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多