refinement
#使用refinement来避免修改类所带来的全局性问题
class String
#该方法是对整个String类对象都是有效的
def to_alphanumeric
gsub(/[^\w\s]/, '')
end
end
#refine适用4种场合,分别如下
1.refine代码块内部
2.如果是模块中,从using开始到模块结束
3.如果是顶层上下文中,从using开始到文件结束
4.细化中调用super方法,则会调用那个没有细化的原始方法
5.类中使用
#1.在refine代码块内部有效的代码如下所示:
module StringExtensions
refine String do
def to_alphanumeric
gsub(/[^\w\s]/, '')
end
"**first**".to_alphanumeric #=>first
end
end
#2.在全局中使用refinement
module StringExtensions
refine String do
def to_alphanumeric
gsub(/[^\w\s]/, '')
end
end
end
"my *first* refinement!".to_alphanumeric #undefined method
using StringExtensions
"my *first* refinement!".to_alphanumeric #=>my first refinement
#3.在模块中使用refinement
module StringExtensions
refine String do
def reverse
"cc"
end
end
end
module StringStuff
using StringExtensions
"my_string".reverse #=>"cc"
end
"my_string".reverse #=> "gnirts_ym"
#4.细化中调用super方法,则会调用那个没有细化的原始方法
module StringRefinement
refine String do
def length
super > 5 ? 'long' : 'short'
end
end
end
using StringRefinement
"war and peace".length #=>"long"
#5.在类中使用
module Demo
refine String do
def reverse
"cc"
end
end
end
class Father
using Demo
puts "demo".reverse # 'cc' Father域内可以使用
def one
puts "demo".reverse #'cc' #one方法被包括在Father中也可以被使用
end
end
class Son < One
puts "hello".reverse #子类不可以直接使用reverse方法
end
Son.new.one #子类可以调用父类的方法,间接使用reverse方法