Ama*_*nut 22 ruby ruby-on-rails relative-path
我开始学习Ruby,有一点我不明白,为什么require指令的相对路径在ruby中不起作用.它几乎适用于我现在的每种脚本语言(JSP,PHP ......).我用一个真实的例子来解释.我有一个名为shapes的文件夹,其中包含3个类形状,矩形和方形.我还有另一个文件test_shapes.rb来自我调用和测试我的类.当我将我的类导入到主文件时,如下所示:
require "./shape"
require "./rectangle"
require "./square"
Run Code Online (Sandbox Code Playgroud)
我找不到找不到的文件的错误.当我包含我的子文件夹的名称时,如下所示:
require "./shapes/shape"
require "./shapes/rectangle"
require "./shapes/square"
Run Code Online (Sandbox Code Playgroud)
代码完美无缺.因为我指定了项目根目录的整个路径(我认为是lib文件夹).当我包括我包括硬盘的绝对路径,如下所示:
require "#{File.dirname(__FILE__)}/shape"
require "#{File.dirname(__FILE__)}/rectangle"
require "#{File.dirname(__FILE__)}/square"
Run Code Online (Sandbox Code Playgroud)
它也很完美.
所以,我只是想要一些解释,如果知道为什么第一个导入方法(当前文件夹的相对路径)不起作用.
nac*_*yot 33
相对路径基于工作目录.我假设同一目录中有主文件.如果你ruby ./shapes/main.rb在项目根目录上运行,ruby会尝试查找{project_root}/shape.rb,而不是{project_root}/shapes/shape.rb.它不起作用.
你需要使用require_relative如下.
# {project_root}/shapes/main.rb
require_relative './shape'
require_relative './rectangle'
require_relative './square'
Run Code Online (Sandbox Code Playgroud)
你正在使用相对路径.它们与脚本执行的位置相关.一般来说这是个坏主意.您应该使用绝对路径,或者require执行精确文件的相对路径.
require File.expand_path("../shape", __FILE__)
Run Code Online (Sandbox Code Playgroud)
PS:require_relative看起来更简洁