ruby 在代码字符串中使用`include`和`using`

jvlzgdj9  于 2023-06-29  发布在  Ruby
关注(0)|答案(1)|浏览(134)

我试图在示例的上下文中计算包含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
7rtdyuoh

7rtdyuoh1#

你的总体意图有点不清楚,除了 “...我想让用户代码(字符串)按原样工作,不修改它”,这可能会或可能不会在任何给定的情况下工作(例如,“我想让用户代码(字符串)按原样工作”*。如果用户代码不好,那么它总是会失败,就像这里一样)

简短回答您请求的实现在设计上根本不可能实现。此外,您的示例尝试在使用同一接收器时混合和匹配示例方法和类示例方法,这也是不可能的。
更长的答案

如果你发布了实际的错误消息,它会显示:

undefined method `using' for #<Context:0x00007ff65eda4498> (NoMethodError)

这是因为using不是一个示例方法。(同样适用于include
好的,让我们试着利用你的示例的特征类

class Context
  def run(code)
    singleton_class.instance_eval code
  end
end

新错误

`using': Module#using is not permitted in methods (RuntimeError)

如果我们通读refinements的文档,我们会看到:

适用范围

您可以在顶级、类和模块内部激活细化。不能在方法范围内激活细化。细化将被激活,直到当前类或模块定义结束,或者如果在顶级使用,则直到当前文件结束。
include没有相同的限制,模块可以包含在方法范围内的示例的特征类中;然而,你的代码还需要能够在相同的上下文中使用相同的接收器调用some_instance_method,这是不可能的。

相关问题