【问题标题】:replacing `instance_exec(&Proc.new)` in Ruby 2.7在 Ruby 2.7 中替换 `instance_exec(&Proc.new)`
【发布时间】:2020-03-11 18:55:05
【问题描述】:

我们的应用中有一些长期存在的代码,用于设置“功能标志”系统,如下所示:

    def configure
      Module.new do
        def self.feature(name, options = {})
          Features.current.add(name, options)
        end
        instance_exec(&Proc.new)
      end
      self
    end

在 Ruby 2.7 中,instance_exec() 位会引发令人讨厌的弃用警告。在这种情况下我将如何解决?简单地用 &block 替换它建议在这里不起作用。

【问题讨论】:

  • 为什么&block 在这里不起作用?
  • 只是好奇,这条线的意义何在?
  • @maxpleaner 大概他们正在做一些类似于 AR 关联的扩展方法 (api.rubyonrails.org/classes/ActiveRecord/Associations/…),至少我是这样做的。我没有得到self 返回值。更多上下文会很好。
  • def configure(&block)instance_exec(&block) 怎么没用?
  • @muistooshort 不是 instance_exec(&Proc.new) 无操作吗?

标签: ruby ruby-2.7


【解决方案1】:

谢谢大家。 @tadman 说得对。我已经用&block 替换了&Proc.new,但它是一个假人,也没有将它添加到方法定义中。在这两个地方添加解决了问题并消除了 ruby​​ 2.7 弃用警告(关于不使用 Proc.new 捕获块。)

更正后的代码:

def configure(&block)
  Module.new do
    def self.feature(name, options = {})
      Features.current.add(name, options)
    end
    instance_exec(&block)
  end
  self
end

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 2011-10-25
    • 2011-01-17
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多