需要文件而不执行代码?

时间:2010-09-19 10:01:37

标签: ruby require

这里我有两个文件:

file.rb

def method
  puts "This won't be outputted."
end

puts "This will be outputted."

main.rb的

require "./file"

当运行main.rb时,它将加载file.rb中的所有代码,这样我就会得到“这将被输出”。在屏幕上。

是否可以加载文件而无需运行代码?

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

3 个答案:

答案 0 :(得分:35)

  

是否可以加载文件而无需运行代码?

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

但是,您可以告诉ruby某些代码只有在文件直接运行时才会执行 - 而不是在需要时运行。为此,只需将代码置于if __FILE__ == $0块内。因此,对于您的示例,这将起作用:

file.rb

def method
  puts "This won't be outputted."
end
if __FILE__ == $0
  puts "This will not be outputted."
end

main.rb的

require "./file"

答案 1 :(得分:7)

if __FILE__ == $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

答案 2 :(得分:1)

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

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