2016-06-21 103 views
1

通過「良好接地的Rubyist」書籍和一些代碼示例,您可以使用require來加載文件。不幸的是,當使用require "stacklike"我得到這個錯誤"/home/userP/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in 'require': cannot load such file -- stacklike (LoadError)"爲什麼'require_relative`工作但'require'不?

使用require_relative "stacklike"工作得很好。爲什麼這個工作,但不require

+0

可能這應該解決你的問題[require和require_relative之間的區別](http://stackoverflow.com/a/29865560/1087841) – Saad

+1

使用'require'。/ stacklike'' –

+0

'require「./stacklike」成功了!試圖理解爲什麼「需要」堆棧式的「'不。 – Ordep81

回答

1

這是因爲require是相對於工作目錄(和庫搜索路徑),並且「stacklike.rb」與您所需的文件在同一目錄中,而不在您的工作目錄中。

您可以將stacklike.rb移動到您的工作目錄 - 或者甚至更好地繼續使用require_relative - 它沒有任何問題。它甚至更好 - 因爲當你閱讀文件時,你確切知道它應該在哪裏。

+0

因此,如果「stacklike.rb」和「stack.rb」(執行require的文件)位於同一個目錄中,請說'/ ruby​​_examples',那麼我的實際工作目錄是什麼? – Ordep81

+0

工作目錄是您從中運行應用程序的地方。或者它可以通過來自UI的環境變量來設置。 那麼當你運行應用程序時,你在哪個目錄?你如何運行它? –

+0

這是您運行腳本時所處的目錄。例如。如果您的腳本位於'/ home/ordek/myproject/bin/myscript.rb'中,並且您位於'/ home/ordek/myproject'中,並將其命名爲'ruby bin/myscript。rb',那麼當前的工作目錄是'/ home/ordek/myproject'。如果你在'/ home/ordek/myproject/bin'中,並且把它叫做'。/ myscript.rb',那麼你當前的工作目錄是'/ home/ordek/myproject/bin'。 –

1

require搜索文件以加載$LOAD_PATHrequire_relative搜索與文件所在的目錄相關的文件,該文件位於對require_relative的調用中。兩者完全不同。

require './stacklike'將查找當前工作目錄中的文件。這是一個非常糟糕的主意:如果您的腳本位於/home/ordek/myproject/bin/myscript.rb,並且您位於/home/ordek/myproject並稱其爲ruby bin/myscript.rb,則當前工作目錄爲/home/ordek/myprojectrequire './stacklike'將查找/home/ordek/myproject/stacklike.rb文件。如果您在/home/ordek/myproject/bin中並且將其稱爲./myscript.rb,那麼您當前的工作目錄是/home/ordek/myproject/binrequire './stacklike'將查找文件/home/ordek/myproject/bin/stacklike.rb

換句話說:哪個文件被加載取決於腳本控制之外的情況(畢竟,腳本不能影響它被調用的位置),這是不好的(至少可以這麼說)。事實上,它可以讓攻擊者將自己的代碼注入到腳本中,這可能是災難性的。

出於這個原因,你應該從來沒有加載文件時依靠當前的工作目錄。

對於你的情況,require_relative只有正確的選擇。

+0

在require_relative上使用require需要什麼時候正確或安全? – Ordep81

+1

當你想從'$ LOAD_PATH'加載一些東西時。就像我說的那樣,這兩者做了不同的事情,實際上沒有太多的選擇:如果你想加載相對於當前正在執行的文件的東西,唯一的選擇是'require_relative',當你想從' $ LOAD_PATH',你唯一的選擇是'require'。唯一的重疊是兩者都可以用於從當前工作目錄中加載某些東西,但這是一個壞主意,不應該這樣做。 –

相關問題