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

时间:2016-10-20 20:51:41

标签: ruby irb

当试图将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

2 个答案:

答案 0 :(得分:1)

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

require_relative 'module'

class Animal

答案 1 :(得分:0)

  

只有在使用require关键字而不是加载时才需要它   关键词。为什么呢?

loadrequirerequire_relative都是将文件名作为要加载的参数的方法。他们需要找到传递参数的文件名

  

<强>负载

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

  

<强>需要

需要类似于加载,主要有两个区别

首先是它不知道当前工作目录。它没有添加到LOAD PATH中,因此一旦ruby搜索它,它就找不到该文件。这就是为什么你必须明确告诉ruby关于当前工作目录以及如何使用 ./ path_to_file 从当前目录中找到该文件。

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

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

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

第二个主要区别在于,当您在文件中对 require 进行多次调用时,将相同的文件名作为参数传递,该文件将仅为 required 时间。 Ruby会跟踪所需的文件。但是,如果多次调用加载并使用与参数相同的文件名,则该文件始终已加载

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

<强> require_relative

require_relative 搜索相对于执行方法调用的文件,这就是您不需要通过显式添加来更改LOAD PATH的原因当前工作目录