class RDoc::Mixin
Mixin
将一个模块的功能添加到另一个上下文中。RDoc::Include
和 RDoc::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