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方法

results matching ""

    No results matching ""