我正在阅读article,内容涉及如何构建简单的DSL和解析文件,但确实如此(正确地如此),指出了这样做的危险性,因为您无法真正相信评估的结果。
这让我开始思考,是否有可能使其变得安全?
为此,是否可以确保在执行上下文中,仅DSL的方法(以及明确允许的方法)可用,并且对其他事物的调用不会执行任何操作或发生错误?
示例中使用的代码是:
class OrdersDsl
def initialize
@orders = { to_perform: [], to_schedule: [] }.freeze
end
def parse(order_filename)
instance_eval File.read(order_filename)
end
private
def order_now(order_name, *order_options)
@orders[:to_perform] << serialize_order(order_name, *order_options)
end
def schedule(order_name, *order_options)
@orders[:to_schedule] << serialize_order(order_name, *order_options)
end
def serialize_order(name, *options)
[name, *options]
end
def OrdersDsl.run(order_filename = 'Orders')
OrdersDsl.new.parse(order_filename)
end
end