我试图理解为什么我收到此错误,我怀疑是因为我在两个单独的Ruby文件中有我的Controller类和View类。我被告知使用require_relative'filename'应该将所有代码从一个文件引用到另一个文件中,但我似乎错过了一些东西。好的,这里,
在 controller.rb 文件中,我有
require_relative 'view'
require_relative 'deck_model'
require_relative 'flashcard_model'
class Controller
def initialize
@deckofcards = Deck.new
@welcome = View.new.welcome
@player_guess = View.new.get_user_guess
@success_view = View.new.success
@failure_view = View.new.failure
end
def run
#Logic to run the game
# @current_card
# @user_guess
puts "Let's see if this prints"
# pull_card_from_deck
end
end
在我的 view.rb 文件中,我有,
require_relative 'controller'
class View
attr_accessor :userguess
def initialize (userguess = " ")
@userguess = userguess
end
def welcome
system ("clear")
puts "Welcome! Let's play a game."
puts "I'll give you a definition and you have to give me the term"
puts "Ready..."
end
def get_user_guess
@userguess = gets.chomp.downcase
end
def success
puts "Excellent! You got it."
end
def failure
puts "No, that's not quite right."
end
end
但是当我运行 controller.rb 时,我收到以下错误,
/Users/sean/Projects/flash/source/controller.rb:11:in `initialize': uninitialized constant Controller::View (NameError)
from /Users/sean/Projects/flash/source/controller.rb:51:in `new'
from /Users/sean/Projects/flash/source/controller.rb:51:in `<top (required)>'
from /Users/sean/Projects/flash/source/view.rb:1:in `require_relative'
from /Users/sean/Projects/flash/source/view.rb:1:in `<top (required)>'
from controller.rb:1:in `require_relative'
from controller.rb:1:in `<main>'
任何人都可以帮我解决这个问题。
答案 0 :(得分:2)
您没有发布完整代码,但听起来这是由您在项目中指定的循环依赖项导致的错误。根据{{1}}和view.rb
,您controller.rb
取决于controller.rb
。 Ruby解释器不会同时执行这些文件;它必须执行一个然后执行另一个。
看起来它首先执行view.rb
,但它看到controller.rb
是必需的,所以它开始执行它。然后在view.rb
中,它看到view.rb
是必需的,因此它再次开始执行controller.rb
。然后在controller.rb
中的某个时刻,您必须创建controller.rb
类的新实例。但是我们还没有定义Controller
类,所以View
未定义,并且在尝试创建该控制器时会出现异常。
要解决此问题,您应该考虑在两个类完全加载之前不创建任何View
或Controller
个对象。
答案 1 :(得分:2)
+1给@DavidGrayson评论。
如果我的假设是正确的,那么您的问题是 view.rb 文件中的require_relative 'controller'
。
如果你看到,View
似乎需要Controller
,那么Controller会被加载,似乎在new
某处发送Controller
然后发送new
View
} {{1}}但它还没有被完全要求。