class RDoc::MethodAttr
表示方法或属性的抽象类。
属性
此方法/属性的其他名称的数组
被调用的块所产生的参数
调用此方法的不同方式
我们正在别名的方法/属性
此方法/属性的名称。
此方法的漂亮参数列表
此方法的参数
这是一个单例方法/属性吗?
源文件令牌流
public,protected,private
公共类方法
从令牌流 text
和方法或属性名称 name
创建一个新的 MethodAttr
。
通常,这是由子类的 super 调用。
RDoc::CodeObject::new
# File rdoc/code_object/method_attr.rb, line 78 def initialize text, name super() @text = text @name = name @aliases = [] @is_alias_for = nil @parent_name = nil @singleton = nil @visibility = :public @see = false @arglists = nil @block_params = nil @call_seq = nil @param_seq = nil @params = nil end
公共实例方法
抽象方法。上下文在其构建阶段调用此方法,以为此已知方法/属性注册新的别名。
-
创建一个名为
an_alias.new_name
的新 AnyMethod/Attribute; -
将
self
添加为新方法或属性的别名 -
将该方法或属性添加到
aliases
-
将该方法或属性添加到
context
。
# File rdoc/code_object/method_attr.rb, line 209 def add_alias(an_alias, context) raise NotImplementedError end
在 src
前面加上行号。依赖于源代码清单的第一行具有
# File xxxxx, line dddd
如果它有这个注释,则将行号添加到 src
中,并删除注释的 , line dddd
部分。
# File rdoc/generator/markup.rb, line 77 def add_line_numbers(src) return unless src.sub!(/\A(.*)(, line (\d+))/, '\1') first = $3.to_i - 1 last = first + src.count("\n") size = last.to_s.length line = first src.gsub!(/^/) do res = if line == first then " " * (size + 1) else "<span class=\"line-num\">%2$*1$d</span> " % [size, line] end line += 1 res end end
此方法的 HTML 片段引用
# File rdoc/code_object/method_attr.rb, line 216 def aref type = singleton ? 'c' : 'i' # % characters are not allowed in html names => dash instead "#{aref_prefix}-#{type}-#{html_name}" end
aref
的前缀,由子类定义。
# File rdoc/code_object/method_attr.rb, line 225 def aref_prefix raise NotImplementedError end
尝试清理 Ruby 解析器传递的内容:删除外括号等。
# File rdoc/code_object/method_attr.rb, line 233 def block_params=(value) # 'yield.to_s' or 'assert yield, msg' return @block_params = '' if value =~ /^[\.,]/ # remove trailing 'if/unless ...' return @block_params = '' if value =~ /^(if|unless)\s/ value = $1.strip if value =~ /^(.+)\s(if|unless)\s/ # outer parentheses value = $1 if value =~ /^\s*\((.*)\)\s*$/ value = value.strip # proc/lambda return @block_params = $1 if value =~ /^(proc|lambda)(\s*\{|\sdo)/ # surrounding +...+ or [...] value = $1.strip if value =~ /^\+(.*)\+$/ value = $1.strip if value =~ /^\[(.*)\]$/ return @block_params = '' if value.empty? # global variable return @block_params = 'str' if value =~ /^\$[&0-9]$/ # wipe out array/hash indices value.gsub!(/(\w)\[[^\[]+\]/, '\1') # remove @ from class/instance variables value.gsub!(/@@?([a-z0-9_]+)/, '\1') # method calls => method name value.gsub!(/([A-Z:a-z0-9_]+)\.([a-z0-9_]+)(\s*\(\s*[a-z0-9_.,\s]*\s*\)\s*)?/) do case $2 when 'to_s' then $1 when 'const_get' then 'const' when 'new' then $1.split('::').last. # ClassName => class_name gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2'). gsub(/([a-z\d])([A-Z])/, '\1_\2'). downcase else $2 end end # class prefixes value.gsub!(/[A-Za-z0-9_:]+::/, '') # simple expressions value = $1 if value =~ /^([a-z0-9_]+)\s*[-*+\/]/ @block_params = value.strip end
如果满足以下任一条件,则方法/属性已记录:
-
它用 :nodoc: 标记;
-
它有注释;
-
它是已记录方法的别名;
-
它有一个已记录的
#see
方法。
RDoc::CodeObject#documented?
# File rdoc/code_object/method_attr.rb, line 132 def documented? super or (is_alias_for and is_alias_for.documented?) or (see and see.documented?) end
包含命名空间的完整方法/属性名称
# File rdoc/code_object/method_attr.rb, line 300 def full_name @full_name ||= "#{parent_name}#{pretty_name}" end
HTML id 友好的方法/属性名称
# File rdoc/code_object/method_attr.rb, line 291 def html_name require 'cgi/util' CGI.escape(@name.gsub('-', '-2D')).gsub('%', '-').sub(/^-/, '') end
将该方法的令牌流转换为 HTML。
如果 options.line_numbers
为 true,则在前面加上行号。
# File rdoc/generator/markup.rb, line 101 def markup_code return '' unless @token_stream src = RDoc::TokenStream.to_html @token_stream # dedent the source indent = src.length lines = src.lines.to_a lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment lines.each do |line| if line =~ /^ *(?=\S)/ n = $~.end(0) indent = n if n < indent break if n == 0 end end src.gsub!(/^#{' ' * indent}/, '') if indent > 0 add_line_numbers(src) if options.line_numbers src end
类方法/属性为“::”,实例方法为“#”。
# File rdoc/code_object/method_attr.rb, line 319 def name_prefix @singleton ? '::' : '#' end
用于输出到 HTML 的名称。对于类方法,使用带有“.”的完整名称,如 SomeClass.method_name
。对于实例方法,如果 context
与父类不匹配,则使用类名。
- 这是为了帮助防止人们使用
-
来调用类方法。
# File rdoc/code_object/method_attr.rb, line 330 def output_name context return "#{name_prefix}#{@name}" if context == parent "#{parent_name}#{@singleton ? '.' : '#'}#{@name}" end
父类的名称,对未编组的方法进行特殊处理
RDoc::CodeObject#parent_name
# File rdoc/code_object/method_attr.rb, line 360 def parent_name @parent_name || super end
此方法的路径,用于 HTML 生成器输出。
# File rdoc/code_object/method_attr.rb, line 353 def path "#{@parent.path}##{aref}" end
带有类/实例指示符的方法/属性名称
# File rdoc/code_object/method_attr.rb, line 339 def pretty_name "#{name_prefix}#{@name}" end
被 RDoc::Generator::JsonIndex
用于创建搜索引擎的记录。
# File rdoc/code_object/method_attr.rb, line 398 def search_record [ @name, full_name, @name, @parent.full_name, path, params, snippet(@comment), ] end
一个要查看的方法/属性,特别是如果此方法/属性没有文档的情况下。
它可以是超类或包含模块的方法/属性,包括始终附加到包含模块的 Kernel 模块。
如果没有这样的方法/属性,则返回 nil
。不包括 #is_alias_for
方法/属性(如果有)。
如果此方法/属性有文档,则模板可能会生成“另请参阅 …”;如果它没有文档,则会生成“请参阅 …”。
# File rdoc/code_object/method_attr.rb, line 152 def see @see = find_see if @see == false @see end
设置此类或模块及其包含的代码对象的存储。
RDoc::CodeObject#store=
# File rdoc/code_object/method_attr.rb, line 160 def store= store super @file = @store.add_file @file.full_name if @file end
方法/属性的类型(类或实例)
# File rdoc/code_object/method_attr.rb, line 346 def type singleton ? 'class' : 'instance' end