0

有没有一种方法可以将用户定义的 Ruby 输入文件加载到我的应用程序中,从而可以访问输入文件中定义的任何变量、方法和类?示例输入文件可能如下所示:

def my_callback(t)
    t ** 2
end
parameter_x = "10 bytes"
parameter_y = my_callback

在我的应用程序中,我想做如下的事情:

input = load_input_file
puts input.parameter_x     # => "10 bytes"
puts input.parameter_y(2)  # => 4

如果无法将输入文件加载到对象的命名空间中,那么下一个最好的方法是对变量进行本地访问(只要它们不是全局可见的):

load_input_file
puts parameter_x     # => "10 bytes"
puts parameter_y(2)  # => 4

这可能吗(无需手动解析输入文件)?

4

1 回答 1

1

我认为这些是您的选择:

1.module环绕input.rb

module Input
  CONST = 1
  def meth
   ...
end

但是您的用户将需要添加:module Inputend围绕他们的代码。(要求不要太多,是吗?)

2. 字符串化

根据您自己的建议:Strinigfyinput.rb文件,用模块包装它,并将局部变量更改为 ivars,然后将其输出到input_modified.rb文件中:

在这种情况下,如果您告诉您的用户@在他们的变量声明之前添加一个会更容易。

require 'fileutils'
require 'tempfile'

inp = 'input.rb'
oup = 'input_modified.rb'
out = Tempfile.new('temp.txt')

File.open(inp, 'r') do |file|
  out.puts "module Input\n" + file.read.gsub("\n","\n\s") + "\nend"
end
FileUtils.mv out.path, oup
于 2012-07-24T03:41:36.677 回答