使用 instance_eval 改进 Ruby

标签 ruby instance-eval refinements

我想对 DSL 进行一些改进。我能够使用此示例进行改进:

module ArrayExtras
  refine Array do
    def speak
      puts 'array!'
    end
  end
end

module MyUniverse
  using ArrayExtras
  class Thing
    def initialize
      [1].speak
    end
  end
end
MyUniverse::Thing.new

这会打印出“数组!”正好。但是一旦我引入instance_eval,方法就找不到了:

module MyUniverse
  using ArrayExtras
  class DSL
    def initialize(&block)
      instance_eval(&block)
    end
  end
end

MyUniverse::DSL.new do
  [1].speak
end

我得到一个undefined methodspeak' for [1]:Array (NoMethodError)`

有没有办法在 instance_eval 中进行优化?

最佳答案

精化是词法范围的。您在错误的词汇上下文中激活了优化。您需要在调用精炼方法的地方激活它:

module ArrayExtras
  refine Array do
    def speak
      puts 'array!'
    end
  end
end

module MyUniverse
  class DSL
    def initialize(&block)
      instance_eval(&block)
    end
  end
end

using ArrayExtras

MyUniverse::DSL.new do
  [1].speak
end
# array!

关于使用 instance_eval 改进 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304218/

相关文章:

ruby - URI Extract 在冒号处转义,有什么办法可以避免这种情况?

ruby - 为什么 Mechanize 不遵循链接

ruby-on-rails - 乘客('Bundler:RubyVersionMismatch')

ruby - 在 FreeBSD 上安装 gosu

ruby - 完善gem的类方法

ruby - Ruby 1.9.2 中 instance_eval 在哪里定义?

ruby - 在instance_eval中定义方法

Ruby:常量查找在 instance_eval/class_eval 中如何工作?

haskell - 如何从具有类型相等约束的 Scott 编码的 GADT 中获取值?

ruby - 动态调度是否会降低圈复杂度?