需要文件而不执行代码?
这里我有两个文件:
file.rb
def method puts "This won't be outputted." end puts "This will be outputted."
main.rb的
require "./file"
当运行main.rb时,它将加载file.rb中的所有代码,这样我就会得到“这将被输出”。 屏幕上。
是否可以加载文件而无需运行代码?
因为我想加载所有方法(在模块和类中),而不必在这些范围之外执行代码。
是否可以加载文件而无需运行代码?
不,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"
if __FILE__ == $0
很好,但是更符合ruby的面向对象方法的方法是将所有想要访问的方法放在一个类中(作为类方法),然后从main.rb中调用它们。
例如
file.rb
class MyUtils def self.method puts "this won't be outputted" end end
然后在main.rb中
require "/.file.rb"
当你想使用你的实用方法时:
MyUtils.method
我不认为修改文件是个好主意 – 可能有很多像这样的文件或这些文件属于客户和其他许多原因。
Ruby擅长元编程,为什么不使用这个function呢?
它可能是这样的。
使用假模块创建文件并将文件放在此处。
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