Ruby 需要不执行代码的文件吗?

Ruby 需要不执行代码的文件吗?,ruby,require,Ruby,Require,这里我有两个文件: file.rb main.rb 当运行main.rb时,它将加载file.rb中的所有代码,因此我将在屏幕上看到“This will be output.” 是否可以在不运行代码的情况下加载文件 因为我想加载所有的方法(也在模块和类中),而不必在这些范围之外执行代码 是否可以在不运行代码的情况下加载文件 不,ruby文件中的所有内容都是可执行代码,包括类和方法定义(例如,当您尝试在if语句中定义一个方法时,可以看到这一点,这很好)。因此,如果不执行文件中的任何内容,则不会定义

这里我有两个文件:

file.rb main.rb 当运行main.rb时,它将加载file.rb中的所有代码,因此我将在屏幕上看到“This will be output.”

是否可以在不运行代码的情况下加载文件

因为我想加载所有的方法(也在模块和类中),而不必在这些范围之外执行代码

是否可以在不运行代码的情况下加载文件

不,ruby文件中的所有内容都是可执行代码,包括类和方法定义(例如,当您尝试在if语句中定义一个方法时,可以看到这一点,这很好)。因此,如果不执行文件中的任何内容,则不会定义任何内容

但是,您可以告诉ruby,某些代码只有在直接运行文件时才能执行,而不是在需要时执行。为此,只需将有问题的代码放入
if\uuu文件\uuu==0
块中即可。因此,对于您的示例,这将起作用:

file.rb main.rb
if\uuuu FILE\uuuu=$0
很好,但更符合ruby面向对象方法的一种方法是将所有您想要访问的方法放在一个类中(作为类方法),然后从main.rb调用它们

e、 g

file.rb

class MyUtils
    def self.method
        puts "this won't be outputted"
    end
end
然后在main.rb中

require "/.file.rb"
当您想使用实用程序方法时:

MyUtils.method

我不认为修改文件是个好主意-可能有很多像这样的文件,或者这些文件属于客户,还有很多其他原因

Ruby擅长元编程,为什么不使用这个特性呢

可能是这样

使用假模块创建文件,并将文件放在此处

File.open("mfile.rb","w") do |f|
  f.write "module FakeModule
"
  f.write File.open("file.rb").read
  f.write "
end"
end
然后加载此文件:

require "/.mfile.rb
以及访问该方法:

FakeModule::method

你能重新解释一下为什么需要它吗?它只是针对我正在编写的应用程序,从一堆文件中加载所有模块、类和方法,但根本不执行任何代码。原因可能是有人忘记删除一些外部代码。
require
load
之间有区别吗?或者某个版本添加了该文件中定义的局部变量,而另一个表单没有?是否有此权利;如果不执行该文件,您将无法访问该文件中的类或方法。使用
if.\uu文件\uuu==$0
有一个很好的技巧。那么,如果您想在以后执行代码,您将如何执行?像例如插件一样,在开始时加载它们,但只在适当的时间执行它们。您是否刚开始使用代码中的一个方法,它就会执行?这非常有效,尽管在RuboCop开始使用它的时候,它被转换为
if$PROGRAM\u NAME==\uuuu FILE\uuu
MyUtils.method
File.open("mfile.rb","w") do |f|
  f.write "module FakeModule
"
  f.write File.open("file.rb").read
  f.write "
end"
end
require "/.mfile.rb
FakeModule::method