【问题标题】:Can't understand why I'm getting a `initialize': uninitialized constant Controller::View (NameError)不明白为什么我得到一个“初始化”:未初始化的常量 Controller::View (NameError)
【发布时间】:2015-03-02 17:06:19
【问题描述】:

我试图了解为什么会出现此错误,我怀疑这是因为我的 Controller 类和 View 类位于两个单独的 Ruby 文件中。有人告诉我,使用 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>'

谁能帮我解决这个问题。

【问题讨论】:

  • 您发布的回溯表明错误发生在/Users/sean/Projects/flash/source/controller.rb:51 的第 51 行,但您发布的文件要短得多。请发布您的整个代码以及您用于运行它的确切命令。
  • +1 到@DavidGrayson。我也会删除require_relative 'controller',因为您的View 类不使用任何Controller 代码。

标签: ruby nameerror


【解决方案1】:

您没有发布完整的代码,但听起来这是您在项目中指定的循环依赖项引起的错误。你有view.rb 取决于controller.rbcontroller.rb 取决于view.rb。 Ruby 解释器不会同时执行这些文件;它必须先执行一个,然后再执行另一个。

看起来它首先执行controller.rb,但它发现view.rb 是必需的,所以它开始执行它。然后在view.rb 它看到controller.rb 是必需的,所以它再次开始执行controller.rb。然后在controller.rb 的某个时刻,您必须创建Controller 类的新实例。但是我们还没有完成对 View 类的定义,所以 View 是未定义的,并且在尝试创建该控制器时会出现异常。

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

【讨论】:

  • 是的,就是这样。非常感谢大卫。
【解决方案2】:

+1 @DavidGrayson 评论。

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

如果您看到,看起来 View 需要 Controller 然后控制器被加载,它似乎将 new 发送到某个地方 Controller 然后将 new 发送到 View 但它没有完全需要。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多