2014-01-16 44 views
1

我使用的是Ruby 2.0,我有兩個文件:hello.rb & assets/display.rb在Ruby代碼中放置「require」的位置?

hello.rb的

class Hello 
    def self.run_it(name) 
    ui = Display.new(name) 
    ui.say_hi 
    end 
end 

require_relative "assets/display" 

Hello.run_it("Someone") 

資產/ display.rb

class Hello::Display 
    def initialize(name = "World") 
    @name = name 
    end 

    def say_hi 
    puts "Hello #{@name}" 
    end 
end 

如果hello.rb的我移動ruby hello.rb輸出require_relative "assets/display"之前class Hello(第一線), uninitialized constant錯誤。這是爲什麼?當需要外部文件時,最佳做法是什麼?在這個簡短示例中,require_relative是正確的方法(vs requirerequire "./some_file")?

+0

你必須向我們展示你的文件系統.. –

+0

@ArupRakshit謝謝,但在這種特殊情況下,是無關緊要的。 – ilovebigmacs

回答

3

標準的做法是把所有或大部分需要陳述這樣在文件的頂部。文件的設計應該儘可能少地依賴於其他文件。

您遇到的問題是您設計的文件display.rb依賴於類Hello

當你這樣說:

class Hello::Display 
end 

這是一樣的:

class Hello 
    class Display 
    end 
end 

但不同的是,在Hello需要定義你可以說Hello::Display之前尚屬首例。由於Hello在您將要求置於文件頂部時尚未定義,因此會出現錯誤。

你能解決這個問題是這樣的:

class Hello 
    class Display 
    # ..your Display code here.. 
    end 
end 

或者這樣:

# Predefine Hello as a class name 
class Hello 
end 

class Hello::Display 
    # ..your Display code here.. 
end 
+0

感謝您的詳細解釋。現在有道理。標記爲接受的答案。你是否還可以確認'require_relative'應該用來代替'require'',如果目標是在後期將代碼打包成寶石? – ilovebigmacs

+1

@NicoS。是的'require_relative'是完美的寶石代碼。但是請注意,它不是必須的,因爲你的'lib'目錄會被rubygems添加到加載路徑中。不過,我認爲它可能仍然是一個更好的選擇,因爲它可以減少衝突的可能性。你可以在這裏閱讀更多關於rubygems的代碼加載:http://guides.rubygems.org/patterns/#loading_code,在這裏你可以閱讀更多關於'require_relative':http://stackoverflow.com/questions/3672586/什麼是需要相對在紅寶石 – Casper

+0

再次感謝你。實際上,我希望我的代碼在*之前工作*我將它打包爲一個gem(所以,現在不在Load Path中),並且在打包時不必更改它(它看起來像一個可怕的模式!)。所以,require_relative符合法案:) – ilovebigmacs

1

如果在hello.rb的開頭包含文件display.rb,當ruby解釋器遇到class Hello::Display時,它預計Hello在之前的某個位置定義。但目前,Hello類尚未定義,因此您會看到該錯誤。

1

此錯誤的原因是您正試圖在Hello類中定義一個類,該類尚未在此處定義。只需拆分名稱分爲兩類:

class Hello 
    class Display 
    def initialize(name = "World") 
     @name = name 
    end 

    def say_hi 
     puts "Hello #{@name}" 
    end 
    end 
end 

定義兩類一次(你可以在以後的開放Hello類)

相關問題