为什么在使用 require 关键字时 Ruby 文件中需要“./”(点 + 正斜杠)?

Why is the "./" (dot + forward slash) needed in Ruby files when using the require keyword?

尝试将 Ruby 依赖文件放入 Ruby 文件时,为什么在输入文件目录时需要“./”(点 + 正斜杠)?奇怪的是,只有在使用 require 关键字而不是 load 关键字时才需要它。

即: module.rb(依赖项)

module SomeModule
    def someMethod
      puts "hello"
    end
end

method.rb

require "./module.rb" 
#require "module.rb" does not work

class Animal
 include SomeModule
end

class Person
    include SomeModule
end

animal = Animal.new
animal.someMethod

person = Person.new
person.someMethod

#irb --> need to also write require " ./method.rb" to call it

如果 module.rb 和 method.rb 在同一目录中,则不应使用 require,而应使用 require_relative。因此,method.rb 的顶部看起来像这样

require_relative 'module'

class Animal

It is only needed when using the require keyword and not the load keyword. Why?

loadrequirerequire_relative 都是以文件名作为要加载的参数的方法。他们需要找到通过参数

传递的文件名

load

load 检查 LOAD PATH 中的文件,可以使用全局变量 $LOAD_PATH$: 即使 当前工作目录 (由 . 指定)实际上不在 LOAD_PATH 中,load 方法 acts 就好像它是这样一样能够找到一个文件,而无需将当前目录显式附加到作为参数传递的文件名

require

requireload 相似,有两个主要区别

首先是它不知道当前工作目录。它不会 添加 它到加载路径,所以一旦 ruby 搜索它,它就找不到文件。这就是为什么你必须明确地告诉 ruby 关于 当前工作目录 以及如何使用 ./[=80= 从当前目录定位文件的原因].

如果您不想添加 ./,您必须将当前目录添加到您的加载路径

$: << '.'
require 'module.rb'

这将起作用,因为当前目录现在位于 ruby 将搜索文件的加载路径中。

第二个主要区别是,当您在一个文件中多次调用 require 并将相同的文件名作为参数传递给它时,该文件将是 required 只是第一次。 Ruby 跟踪 需要的文件 。但是,使用相同的文件名作为参数多次调用 load,文件总是 loaded.

require 'time' => true
require 'time' => false #second call within the same file

require_relative

require_relative 搜索 相对于执行方法调用的文件 ,这就是为什么你不需要通过显式添加 当前工作目录

来改变加载路径