2011-02-06 29 views
12

可以說我有三個類,每個類都在它自己的文件中定義。例如ClassA in ClassA.rb etc ...無法將類包含到Ruby中的另一個類中:未初始化的常量(NameError)

class ClassA 
    def initialize 
    end 

    def printClassA 
    puts "This is class A" 
    end 
end 

class ClassB 
    def initialize 
    end 

    def printClassB 
    puts "This is class B" 
    end 
end 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

正如您所見,ClassC需要其他兩個類才能正常工作。我假設,需要有一種方法來在ClassC中導入/包含/加載其他兩個類。

我是Ruby的新手,我嘗試了load/include/require的每個排列,我無法弄清楚如何讓它運行。

我通常只是得到:

classc.rb:2:in `<class:ClassC>': uninitialized constant ClassC::ClassA (NameError) 
    from classc.rb:1:in `<main>' 

或與我進口語法錯誤/包括/ require語句。

使用Windows 7,Ruby 1.9.2,RadRails,所有文件都在同一個項目和源文件夾中。

對不起,如果這個問題類似於這裏的一些其他問題,但大多數解決「未初始化常量」的答案是「只需要文件」。我試過了,它不起作用。

回答

19

我認爲你的問題是$:,控制require尋找文件的變量,不再包含Ruby 1.9.2及更高版本中的當前目錄(出於安全原因)。告訴紅寶石到哪裏尋找文件,你需要做的一個:

require_relative 'ClassA' # which looks in the same directory as the file where the method is called 

# or # 

require './ClassA' # which looks in the current working directory 
+0

非常感謝。哇 – user604886 2011-02-06 01:24:36

3

如果我把一切都在一個文件中,並添加兩行代碼,它工作正常的1.9.2:

class ClassA 
    def initialize 
    end 

    def printClassA 
    puts "This is class A" 
    end 
end 

class ClassB 
    def initialize 
    end 

    def printClassB 
    puts "This is class B" 
    end 
end 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 
# >> This is class A 
# >> This is class B 

這告訴我代碼是好的,問題是在你包含的文件。

我打出了前兩類爲單獨的文件,「classa.rb」及「classb.rb」,然後修改了文件:

require_relative './classa' 
require_relative './classb' 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 

它運行後,我得到了相同的結果顯示它運行正確。

我使用'./path/to/file',因爲它是自我記錄,我正在尋找,但是'path/to/file',或者在這種情況下'classa'也可以。

然後,我切換到Ruby 1.8.7,並將require_relative行更改爲require,並再次保存到文件中。從命令行運行它再次正常工作:

require './classa' 
require './classb' 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 

出於安全原因,Ruby 1.9+刪除當前目錄'。'從require搜索的目錄列表中。因爲他們知道我們會用乾草叉和火把打死他們,所以他們添加了require_relative命令,該命令允許在當前目錄和下面進行搜索。

+0

你把它們分成三個單獨的文件嗎?如果它們都在同一個.rb文件中,它將正常工作。 – user604886 2011-02-06 01:25:25

相關問題