我试图在示例的上下文中计算包含Ruby代码的字符串,同时维护标准的Ruby方法,如using
(用于细化)和include
。
这是我最精简的例子。我想使用户代码(字符串)的工作是,没有修改它。我希望对Context#run
方法进行必要的修改。
require 'fileutils'
module SomeUserRefinement
refine String do
def header
"=== #{self} ==="
end
end
end
class Context
def run(code)
instance_eval code
end
def some_instance_method
puts "works"
end
end
user_code = <<~CODE
using SomeUserRefinement # not working
include FileUtils # not working
puts 'Caption'.header
some_instance_method
CODE
context = Context.new
context.run user_code
1条答案
按热度按时间7rtdyuoh1#
你的总体意图有点不清楚,除了 “...我想让用户代码(字符串)按原样工作,不修改它”,这可能会或可能不会在任何给定的情况下工作(例如,“我想让用户代码(字符串)按原样工作”*。如果用户代码不好,那么它总是会失败,就像这里一样)
简短回答您请求的实现在设计上根本不可能实现。此外,您的示例尝试在使用同一接收器时混合和匹配示例方法和类示例方法,这也是不可能的。
更长的答案
如果你发布了实际的错误消息,它会显示:
这是因为
using
不是一个示例方法。(同样适用于include
)好的,让我们试着利用你的示例的特征类
新错误
如果我们通读refinements的文档,我们会看到:
适用范围
您可以在顶级、类和模块内部激活细化。不能在方法范围内激活细化。细化将被激活,直到当前类或模块定义结束,或者如果在顶级使用,则直到当前文件结束。
include
没有相同的限制,模块可以包含在方法范围内的示例的特征类中;然而,你的代码还需要能够在相同的上下文中使用相同的接收器调用some_instance_method
,这是不可能的。