class RDoc::Mixin

Mixin 将一个模块的功能添加到另一个上下文中。RDoc::IncludeRDoc::Extend 都是 mixin。

属性

name[RW]

包含的模块的名称

公共类方法

new(name, comment) 点击切换源代码

name 创建一个新的 Mixin,并带有 comment

调用超类方法 RDoc::CodeObject::new
# File rdoc/code_object/mixin.rb, line 16
def initialize(name, comment)
  super()
  @name = name
  self.comment = comment
  @module = nil # cache for module if found
end

公共实例方法

<=>(other) 点击切换源代码

Mixin 按名称排序

# File rdoc/code_object/mixin.rb, line 26
def <=> other
  return unless self.class === other

  name <=> other.name
end
full_name() 点击切换源代码

基于 module 的全名

# File rdoc/code_object/mixin.rb, line 41
def full_name
  m = self.module
  RDoc::ClassModule === m ? m.full_name : @name
end
module() 点击切换源代码

尝试查找包含的模块对象。如果未知,则返回名称。

Ruby 用于解析包含模块名称的作用域规则是:

  • 首先查找当前上下文的子项;

  • 如果未找到,则按反向包含顺序查找包含模块的子项;

  • 如果仍然未找到,则向上查找名称的层次结构。

当调用 include 的模块引用不存在的模块时,此方法具有 O(n!) 的行为。在解析完所有文件之前,避免调用 module。这种行为是由于 ruby 的常量查找行为导致的。

截至 2011 年 10 月初,没有任何 gem 包含不存在的模块。

# File rdoc/code_object/mixin.rb, line 75
def module
  return @module if @module

  # search the current context
  return @name unless parent
  full_name = parent.child_name(@name)
  @module = @store.modules_hash[full_name]
  return @module if @module
  return @name if @name =~ /^::/

  # search the includes before this one, in reverse order
  searched = parent.includes.take_while { |i| i != self }.reverse
  searched.each do |i|
    inc = i.module
    next if String === inc
    full_name = inc.child_name(@name)
    @module = @store.modules_hash[full_name]
    return @module if @module
  end

  # go up the hierarchy of names
  up = parent.parent
  while up
    full_name = up.child_name(@name)
    @module = @store.modules_hash[full_name]
    return @module if @module
    up = up.parent
  end

  @name
end
store=(store) 点击切换源代码

设置此类或模块及其包含的代码对象的存储。

调用超类方法 RDoc::CodeObject#store=
# File rdoc/code_object/mixin.rb, line 110
def store= store
  super

  @file = @store.add_file @file.full_name if @file
end