无法理解为什么我得到一个`initialize&#39 ;:未初始化的常量Controller :: View(NameError)

时间:2015-03-02 17:06:20

标签: ruby nameerror

我试图理解为什么我收到此错误,我怀疑是因为我在两个单独的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>'

任何人都可以帮我解决这个问题。

2 个答案:

答案 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未定义,并且在尝试创建该控制器时会出现异常。

要解决此问题,您应该考虑在两个类完全加载之前不创建任何ViewController个对象。

答案 1 :(得分:2)

+1给@DavidGrayson评论。

如果我的假设是正确的,那么您的问题是 view.rb 文件中的require_relative 'controller'

如果你看到,View似乎需要Controller,那么Controller会被加载,似乎在new某处发送Controller然后发送new View } {{1}}但它还没有被完全要求。