如何使用ruby中外部文件的代码执行本地函数?

时间:2013-05-08 21:37:44

标签: ruby

require可以执行本地定义的函数吗?我想描述我需要的最简单的方法就是展示一个例子。

我正在使用ruby 1.9.3,但欢迎1.8和2.0的解决方案。

我有一个文件main.rb如下:

class Stuff
  def self.do_stuff(x)
    puts x
  end
  require_relative('./custom.rb')

  do_stuff("y")
end

并且在同一文件夹中还有一个custom.rb文件,其中包含以下内容:

do_stuff("x")

运行main.rb,我有以下输出:

/home/fotanus/custom.rb:1:in `<top (required)>': undefined method `do_stuff' for main:Object (NoMethodError)
    from main.rb:5:in `require_relative'
    from main.rb:5:in `<class:Stuff>'
    from main.rb:1:in `<main>'

请注意,如果没有require,则输出为y

2 个答案:

答案 0 :(得分:4)

我不确定它是否是最佳解决方案,但使用eval应该可以解决问题。

class Stuff
  def self.do_stuff(x)
    puts x
  end
  eval(File.read('./custom.rb'))

  do_stuff("y")
end

输出将是:

pigueiras@pigueiras$ ruby stuff.rb 
x
y

答案 1 :(得分:2)

在C中,#include将代码按原样丢弃到文件中。 Ruby中的require是不同的:它实际上在自己的范围内运行所需文件中的代码。这很好,因为否则我们可以通过在require之前重新定义内容来中断require代码。

如果您想要阅读脚本的内容并在当前上下文中对其进行评估,可以采用以下方法:File.readeval