Ruby 中如何显式地终止被 using 的 refinement?

字母数字或汉字
  • 682

烦请观察以下代码:

module A
    refine String
        def reverse
            self
        end
    end
end

using A
p "abc".reverse
# => "abc"

remove_using A
p "abc".reverse
# => "cba"

请问是否存在这样效果的 remove_using 方法?以动态消除 using 了一个 refinement 后产生的影响。

根据观察,似乎这是故意为之,因为语言设计者希望 refinement 尽可能地被静态地使用:

Because refinement activation should be as static as possible.
回复
阅读 1.2k
1 个回答
virgil
  • 3
新手上路,请多包涵

细化refine:与打开类不同,细化在默认情况下并不生效。细化的作用范围只在该模块内部有效。细化和打开类的作用相似,区别在于细化不是全局性的。
细化只在两种场合有效:1.refine代码块内部;2.从using语句的位置开始到模块结束(如果是在模块内部调用using语句),或者到文件结束(如果是在顶层上下文中调用using)。
在细化有限的作用域范围内,其作用跟打开类(或者叫猴子补丁)是一样的。
细化一个类就像把一个补丁直接打到原有代码上一样。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏