2014-03-13 95 views
0

所以這是我的第一個關於堆棧溢出的問題,我是Ruby的新手,所以如果這是一個簡單的問題,請很好。爲什麼Ruby在類B中看到`A.run`作爲常量而不是類?

我開始在OOP和製作遊戲。我認爲錯誤的是,Ruby認爲在當前課堂中不同的課程是不變的。

這裏是我的代碼:

./a.rb

require "./b" 

class A 
    class << self 

    def run 
     puts "A ran." 
    end 

    end 

end 

./b.rb

class B                                           
    require './a' 

    def test 
    A.run 
    end 

end 

b = B.new 
b.test 

當我運行ruby b.rb,我得到:

/Users/alexstriff/Dropbox/Code/ruby/ex45/b.rb:5:in `test': uninitialized constant B::A (NameError)                    
     from /Users/alexstriff/Dropbox/Code/ruby/ex45/b.rb:11:in `<top (required)>' 
     from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require' 
     from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require' 
     from /Users/alexstriff/Dropbox/Code/ruby/ex45/a.rb:1:in `<top (required)>' 
     from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require' 
     from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require' 
     from b.rb:2:in `<class:B>' 
     from b.rb:1:in `<main>' 

那麼爲什麼A.runclass B視爲常量,而不是作爲一個類?

編輯:

難道可能被 '圓形需要' 有問題嗎?我在ruby -w下運行了這個,然後就出現了。

回答

0

是的,正如你在編輯中提到的那樣,我相信你的問題是一個循環的要求。正如你所看到的,當你運行ruby b.rb時,你需要a.rb,然後再次需要b.rb等等。相反,我建議刪除a.rb中的require,因爲它似乎不依賴於b.rb 。

作爲一個單獨的問題,我認爲你得到的錯誤是因爲你沒有指定A是一個頂級類。另外,具有的class B內要求不作AB訪問,所以我會以外,而不是將其移動:測試另一個問題,當

require './a' 

class B 
    def test 
    ::A.run 
    end 
end 

b = B.new 
b.test 
+0

謝謝你的快速responce.I竟然出現了'require'那裏,似乎我忘了它會導致問題。 – jfjhh

+0

@jfjhh沒問題,很高興你解決了這個問題! – jvperrin

相關問題