这里我有两个文件:
def method
puts "This won't be outputted."
end
puts "This will be outputted."
require "./file"
当运行main.rb时,它将加载file.rb中的所有代码,这样我就会得到“这将被输出”。在屏幕上。
是否可以加载文件而无需运行代码?
原因我想加载所有方法(在模块和类中),而不必在这些范围之外执行代码。
答案 0 :(得分:35)
是否可以加载文件而无需运行代码?
不,ruby文件中的所有内容都是可执行代码,包括类和方法定义(例如,当你尝试在if语句中定义一个方法时,可以看到这个,这很好用)。因此,如果您不在文件中执行任何操作,则不会定义任何内容。
但是,您可以告诉ruby某些代码只有在文件直接运行时才会执行 - 而不是在需要时运行。为此,只需将代码置于if __FILE__ == $0
块内。因此,对于您的示例,这将起作用:
def method
puts "This won't be outputted."
end
if __FILE__ == $0
puts "This will not be outputted."
end
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