我在备用类的方法中调用属于某些类的方法时遇到问题

I'm having trouble calling methods belonging to certain classes within methods of an alternate class

提问人:mycupisoverflowing 提问时间:2/10/2021 更新时间:2/11/2021 访问量:31

问:

这是我第一次问问题,所以如果我能做得更好,请告诉我。

我有三个班级,所有班级都需要一起工作。下面是一个示例:

class CLI

def self.start
   s=Scraper.new
    puts "Welcome to your basic music theory coordinator!"
    puts ""
    puts "If you want to check out a key, choose from the list below by typing the key as you see it listed."
    puts "*not yet functional* If you want to generate a random chord progression in a certain key, just pick the key from the list and say generate"
    puts ""

    puts "Pick a key:"
    puts " "
    puts "Major:"
    puts s.all_scale_names[0]
    puts " "
    puts "Minor:"
    puts s.all_scale_names[1]

      s.key_information_creator
   end
end

CLI.start

尝试调用CLI.start时收到的错误如下:

9: from lib/comman_line_interface.rb:1:in `<main>'
        8: from lib/comman_line_interface.rb:1:in `require_relative'
        7: from /home/code/cli-test/test-cli/lib/scraper.rb:4:in `<top (required)>'
        6: from /home/code/cli-test/test-cli/lib/scraper.rb:4:in `require_relative'
        5: from /home/code/cli-test/test-cli/lib/song.rb:5:in `<top (required)>'
        4: from /home/code/cli-test/test-cli/lib/song.rb:5:in `require_relative'
        3: from /home/code/cli-test/test-cli/lib/key.rb:6:in `<top (required)>'
        2: from /home/code/cli-test/test-cli/lib/key.rb:6:in `require_relative'
        1: from /home/code/cli-test/test-cli/lib/comman_line_interface.rb:31:in `<top (required)>'
/home/code/cli-test/test-cli/lib/comman_line_interface.rb:12:in `start': uninitialized constant CLI::Scraper (NameError)

我想我需要做一些叫做命名空间的事情,但我不完全确定。关于如何解决这个问题并让我的班级很好地协同工作的一些方向或选项将不胜感激。谢谢。

Ruby 对象 命名空间 类方法

评论


答:

0赞 Todd A. Jacobs 2/11/2021 #1

了解堆栈跟踪

堆栈跟踪非常简单。它告诉你:

  1. 您尚未成功要求 Scraper 类/模块。
  2. 当前命名空间中没有定义 CLI::Scraper。
  3. 您正在对不在范围内或代码中根本不存在的对象调用方法。

调试代码的步骤

解决上述问题,看看这能给你带来什么。首先,在调试程序时,您应该考虑一些具体事项:

  1. 您的 CLI 类无法在其命名空间之外引用 Scraper 类/模块,除非您告诉它在哪里查看导入模块或在公共模块中命名它们,以便您可以显式引用 Foo::Scraper 和 Foo::CLI。

  2. 无论如何,最好将 Scraper 注入到 CLI 初始化中,但您还没有展示足够的代码来提供有意义的示例。

  3. 去掉所有不必要的代码,直到你可以让基本的东西工作。例如:

    class CLI
      def self.start
        defined? Scraper
      end
    end
    
  4. 继续重构,直到您的最小 CLI#start 返回而不是 ."constant"nil

评论

1赞 mycupisoverflowing 2/11/2021
太棒了,谢谢你的帮助。很抱歉没有提供足够的代码,下次我一定会这样做。再次感谢