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