class RDoc::AnyMethod
AnyMethod
是表示方法的对象的基本类
属性
c_function[RW]
实现此方法的 C 函数(如果在 C 文件中定义)
calls_super[RW]
如果为 true,则此方法使用 super
调用超类版本
dont_rename_initialize[RW]
不要将 #initialize 重命名为 ::new
params[RW]
此方法的参数
section_title[RW]
方法的分区标题(如果在 C 文件中通过 :category:
定义)
公共类方法
new(text, name) 点击以切换源代码
使用标记流 text
和 name
创建一个新的 AnyMethod
调用超类方法
RDoc::MethodAttr::new
# File rdoc/code_object/any_method.rb, line 46 def initialize text, name super @c_function = nil @dont_rename_initialize = false @token_stream = nil @calls_super = false @superclass_method = nil end
公共实例方法
add_alias(an_alias, context = nil) 点击以切换源代码
将 an_alias
作为此方法在 context
中的别名添加。
# File rdoc/code_object/any_method.rb, line 59 def add_alias an_alias, context = nil method = self.class.new an_alias.text, an_alias.new_name method.record_location an_alias.file method.singleton = self.singleton method.params = self.params method.visibility = self.visibility method.comment = an_alias.comment method.is_alias_for = self @aliases << method context.add_method method if context method end
aref_prefix() 点击以切换源代码
aref
的前缀是 ‘method’。
# File rdoc/code_object/any_method.rb, line 76 def aref_prefix 'method' end
arglists() 点击以切换源代码
call_seq() 点击以切换源代码
调用此方法的不同方式
# File rdoc/code_object/any_method.rb, line 96 def call_seq unless call_seq = _call_seq call_seq = is_alias_for._call_seq if is_alias_for end return unless call_seq deduplicate_call_seq(call_seq) end
call_seq=(call_seq) 点击以切换源代码
设置调用此方法的不同方式。如果给出一个空 call_seq
,则假定为 nil。
另请参见 param_seq
# File rdoc/code_object/any_method.rb, line 112 def call_seq= call_seq return if call_seq.empty? @call_seq = call_seq end
has_call_seq?() 点击以切换源代码
方法是否具有 call-seq。
# File rdoc/code_object/any_method.rb, line 121 def has_call_seq? !!(@call_seq || is_alias_for&._call_seq) end
marshal_dump() 点击以切换源代码
转储此 AnyMethod
以供 ri 使用。另请参见 marshal_load
# File rdoc/code_object/any_method.rb, line 147 def marshal_dump aliases = @aliases.map do |a| [a.name, parse(a.comment)] end is_alias_for = [ @is_alias_for.parent.full_name, @is_alias_for.singleton, @is_alias_for.name ] if @is_alias_for [ MARSHAL_VERSION, @name, full_name, @singleton, @visibility, parse(@comment), @call_seq, @block_params, aliases, @params, @file.relative_name, @calls_super, @parent.name, @parent.class, @section.title, is_alias_for, ] end
marshal_load(array) 点击以切换源代码
从 array
加载此 AnyMethod
。 对于加载的 AnyMethod
,以下方法将返回缓存的值
# File rdoc/code_object/any_method.rb, line 184 def marshal_load array initialize_visibility @dont_rename_initialize = nil @token_stream = nil @aliases = [] @parent = nil @parent_name = nil @parent_class = nil @section = nil @file = nil version = array[0] @name = array[1] @full_name = array[2] @singleton = array[3] @visibility = array[4] @comment = array[5] @call_seq = array[6] @block_params = array[7] # 8 handled below @params = array[9] # 10 handled below @calls_super = array[11] @parent_name = array[12] @parent_title = array[13] @section_title = array[14] @is_alias_for = array[15] array[8].each do |new_name, comment| add_alias RDoc::Alias.new(nil, @name, new_name, comment, @singleton) end @parent_name ||= if @full_name =~ /#/ then $` else name = @full_name.split('::') name.pop name.join '::' end @file = RDoc::TopLevel.new array[10] if version > 0 end
name() 点击以切换源代码
方法名称
如果方法没有分配的名称,它将从 call_seq
中提取。
# File rdoc/code_object/any_method.rb, line 233 def name return @name if @name @name = @call_seq[/^.*?\.(\w+)/, 1] || @call_seq[/^.*?(\w+)/, 1] || @call_seq if @call_seq end
param_list() 点击以切换源代码
此方法的方法和 yield 参数的列表。 call-seq
参数优先于解析的方法和块参数。
# File rdoc/code_object/any_method.rb, line 246 def param_list if @call_seq then params = @call_seq.split("\n").last params = params.sub(/.*?\((.*)\)/, '\1') params = params.sub(/(\{|do)\s*\|([^|]*)\|.*/, ',\2') elsif @params then params = @params.sub(/\((.*)\)/, '\1') params << ",#{@block_params}" if @block_params elsif @block_params then params = @block_params else return [] end if @block_params then # If this method has explicit block parameters, remove any explicit # &block params = params.sub(/,?\s*&\w+/, '') else params = params.sub(/\&(\w+)/, '\1') end params = params.gsub(/\s+/, '').split(',').reject(&:empty?) params.map { |param| param.sub(/=.*/, '') } end
param_seq() 点击以切换源代码
此方法的漂亮参数列表。 如果方法的参数由 call-seq
给出,则优先于解析的值。
# File rdoc/code_object/any_method.rb, line 278 def param_seq if @call_seq then params = @call_seq.split("\n").last params = params.sub(/[^( ]+/, '') params = params.sub(/(\|[^|]+\|)\s*\.\.\.\s*(end|\})/, '\1 \2') elsif @params then params = @params.gsub(/\s*\#.*/, '') params = params.tr_s("\n ", " ") params = "(#{params})" unless params[0] == ?( else params = '' end if @block_params then # If this method has explicit block parameters, remove any explicit # &block params = params.sub(/,?\s*&\w+/, '') block = @block_params.tr_s("\n ", " ") if block[0] == ?( block = block.sub(/^\(/, '').sub(/\)/, '') end params << " { |#{block}| ... }" end params end
skip_description?() 点击以切换源代码
是否跳过方法描述,对于具有不包含方法名称的 call-seq 的别名的方法为 true。
# File rdoc/code_object/any_method.rb, line 310 def skip_description? has_call_seq? && call_seq.nil? && !!(is_alias_for || !aliases.empty?) end
store=(store) 点击以切换源代码
设置此方法及其引用的代码对象的存储。
调用超类方法
RDoc::MethodAttr#store=
# File rdoc/code_object/any_method.rb, line 317 def store= store super @file = @store.add_file @file.full_name if @file end
superclass_method() 点击以切换源代码
对于 super
的方法,找到将被调用的超类方法。
# File rdoc/code_object/any_method.rb, line 326 def superclass_method return unless @calls_super return @superclass_method if @superclass_method parent.each_ancestor do |ancestor| if method = ancestor.method_list.find { |m| m.name == @name } then @superclass_method = method break end end @superclass_method end
受保护的实例方法
_call_seq() 点击以切换源代码
call_seq
,没有去重和别名查找。
# File rdoc/code_object/any_method.rb, line 345 def _call_seq @call_seq if defined?(@call_seq) && @call_seq end
私有实例方法
deduplicate_call_seq(call_seq) 点击以切换源代码
call_seq
,如果此方法是别名方法,则删除别名示例信息。
# File rdoc/code_object/any_method.rb, line 355 def deduplicate_call_seq(call_seq) return call_seq unless is_alias_for || !aliases.empty? method_name = self.name method_name = method_name[0, 1] if method_name =~ /\A\[/ entries = call_seq.split "\n" ignore = aliases.map(&:name) if is_alias_for ignore << is_alias_for.name ignore.concat is_alias_for.aliases.map(&:name) end ignore.map! { |n| n =~ /\A\[/ ? /\[.*\]/ : n} ignore.delete(method_name) ignore = Regexp.union(ignore) matching = entries.reject do |entry| entry =~ /^\w*\.?#{ignore}[$\(\s]/ or entry =~ /\s#{ignore}\s/ end matching.empty? ? nil : matching.join("\n") end