ActiveSupport-CoreExt-Module

浏览:1919 发布日期:2016-09-01 13:28:11
  1. aliasmethodchain(target, feature) 生成别名方法链,例如:

alias_method_chain :foo, :feature, 将会生成
alias_method :foo_without_feature, :foo
alias_method :foo, :foo_with_feature

,包括!, ?结尾的方法,也能正确生成

  1. aliasattribute(newname, old_name) 对属性设置别名,同时也会包含getter, setter, ?查询方法

  2. anoymous? 如果模块的name值为空或为nil的话,则返回true,否则返回false

模块内部操作

打开了Module类,添加了attraccessor :attrinternal_namingformat,并设置它等于'@%s'。

定义了私有方法attrinternalivarname(attr) 返回内部方法名称,它会返回@attr的名称。

定义了attrinternaldefine(attrname, type), 调用attr#{type} :attrname的方法, 设置attrname别名到attrname方法,然后删除了attrname这个方法,其中如果attrname有=?后缀,它会自动生成。

  1. attrinternalreader(*attrs) 对参数一次调用attrinternaldefine方法, type为:reader

  2. attrinterwriter(*attrs) 同上,只是type为:writer

  3. attrinternalaccessor(*attrs) 同时设置:reader, :writer方法

  4. mattrreader(*syms) 接受可变符号参数,可以接受options,可供设置的选项有 :instancereader, :instance_accessor,如果这两个选项为true,那么不仅会设置为模块级方法,还会设置模块实例方法

  5. mattr_writer(*syms) 同上

  6. mattr_accessor(*syms)

  7. delegate(*methods) 定义委托,

class Greeter < ActiveRecord::Base
   def hello
     "hello"
   end

   def goodbye
     "goodbye"
   end
end

class Foo < ActionRecord::Base
  belongs_to :greeter
  delegate :hello, :to => :greeter
end

Foo.new.hello # => "hello"
Foo.new.goodbye # => 抛出NoMethodError

可以定义多个方法:

class Foo < ActiveRecord::Base
   belongs_to :greeter
   delegate :hello, :goodbye, :to => :greeter
 end

 Foo.new.goodbye # => "goodbye"

还可以对实例方法,类变量,常理定义委托:

class Foo
  CONSTANT_ARRAY = [0,1,2,3]
  @@class_array  = [4,5,6,7]

  def initialize
    @instance_array = [8,9,10,11]
  end
  delegate :sum, :to => :CONSTANT_ARRAY
  delegate :min, :to => :@@class_array
  delegate :max, :to => :@instance_array
end

还可以指定前缀,前缀可以是true, 或是自定义的值:

class Invoice < Struct.new(:client)
  delegate :name, :address, :to => :client, :prefix => true
end

john_doe = Person.new("John Doe", "Vimmersvej 13")
invoice = Invoice.new(john_doe)
invoice.client_name    # => "John Doe"
invoice.client_address # => "Vimmersvej 13"

class Invoice < Struct.new(:client)
  delegate :name, :address, :to => :client, :prefix => :customer
end

invoice = Invoice.new(john_doe)
invoice.customer_name    # => "John Doe"
invoice.customer_address # => "Vimmersvej 13"

还可以设置allow_nil选项,如果为true,则委托对象为nil时,不会抛出抛出异常,否则将抛出异常。

  1. deprecate 声明方法已被弃用。通过调用ActiveSupport::Deprecation.deprecate_methods

  2. parentname 设置@parentname为父模块名称,它是冻结的stirng, 没有的话设置为nil,返回@parent_name

  3. parent 如果存在父模块,则返回父模块常量,否则返回Object

  4. parents 返会父常量数组

  5. local_constants 返回本地定义的常量

  6. localconstantnames 返回字符串形式的本地定义的常量

  7. instancemethodnames 返回字符串形式的数组,对instancemethods依次调用tos

  8. methodsnames 返回字符串形式的数组,对methods依次调用tos

  9. qualifiedconstdefined?(path) 判断常量路径是否都已经定义,返回布尔值 。 注意:这个方法似乎对1.9之后ruby没啥用了。

  10. rechable? 判断当前模块是不是常量,它通过safe_constantize得到名称常量,然后和当前self比较

  11. removepossiblemethod(method) 可以移除当前实例父类,或私有方法,忽略NameError异常。

  12. redefine_method(method, &block) 移除可能存在的方法,并重新定义

  13. synchronize(*methods) 通过别名方法链,将methods方法参数,通过加锁,实现同步方法。 并声明:synchronize方法被弃用。