我在调用备用 class 方法中属于某些 classes 的方法时遇到问题
I'm having trouble calling methods belonging to certain classes within methods of an alternate class
这是我第一次提问,所以如果我可以做得更好,请告诉我。
我有三个 类,它们都需要协同工作。这是一个例子:
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)
我想我需要做一些叫做命名空间的事情,但我不完全确定。非常感谢有关如何解决此问题并让我的 类 协同工作的一些指导或选项。谢谢
了解堆栈跟踪
您的堆栈跟踪非常简单。它告诉你:
- 您还没有成功要求您的 Scraper class/module。
- 您当前的命名空间中没有定义 CLI::Scraper。
- 您正在对不在范围内或代码中根本不存在的对象调用方法。
调试代码的步骤
解决上述问题,看看它能给你带来什么。在调试程序时,您应该立即考虑一些具体的事情:
您的 CLI class 无法在其名称空间之外引用 Scraper class/module 除非您告诉它在何处查看导入模块或在公共模块中对它们进行命名空间,因此您可以明确引用 Foo::Scraper 和 Foo::CLI。
你最好还是将 Scraper 注入到你的 CLI 初始化中,但是你没有展示足够的代码来提供一个有意义的例子。
去掉所有非必要的代码,直到您可以使基础知识正常工作。例如:
class CLI
def self.start
defined? Scraper
end
end
继续重构直到你的最小 CLI#start returns "constant"
而不是 nil
.
这是我第一次提问,所以如果我可以做得更好,请告诉我。
我有三个 类,它们都需要协同工作。这是一个例子:
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)
我想我需要做一些叫做命名空间的事情,但我不完全确定。非常感谢有关如何解决此问题并让我的 类 协同工作的一些指导或选项。谢谢
了解堆栈跟踪
您的堆栈跟踪非常简单。它告诉你:
- 您还没有成功要求您的 Scraper class/module。
- 您当前的命名空间中没有定义 CLI::Scraper。
- 您正在对不在范围内或代码中根本不存在的对象调用方法。
调试代码的步骤
解决上述问题,看看它能给你带来什么。在调试程序时,您应该立即考虑一些具体的事情:
您的 CLI class 无法在其名称空间之外引用 Scraper class/module 除非您告诉它在何处查看导入模块或在公共模块中对它们进行命名空间,因此您可以明确引用 Foo::Scraper 和 Foo::CLI。
你最好还是将 Scraper 注入到你的 CLI 初始化中,但是你没有展示足够的代码来提供一个有意义的例子。
去掉所有非必要的代码,直到您可以使基础知识正常工作。例如:
class CLI def self.start defined? Scraper end end
继续重构直到你的最小 CLI#start returns
"constant"
而不是nil
.