class RDoc::MethodAttr

表示方法或属性的抽象类。

属性

aliases[R]

此方法/属性的其他名称的数组

arglists[R]

如果不存在 call_seq,则为带有方法名称的 call_seqparam_seq

block_params[R]

被调用的块所产生的参数

call_seq[RW]

调用此方法的不同方式

is_alias_for[RW]

我们正在别名的方法/属性

name[RW]

此方法/属性的名称。

param_seq[R]

此方法的漂亮参数列表

params[RW]

此方法的参数

singleton[RW]

这是一个单例方法/属性吗?

text[R]

源文件令牌流

visibility[RW]

public,protected,private

公共类方法

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

从令牌流 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

公共实例方法

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

singleton 然后按 name 排序

# File rdoc/code_object/method_attr.rb, line 113
def <=>(other)
  return unless other.respond_to?(:singleton) &&
                other.respond_to?(:name)

  [@singleton      ? 0 : 1, name_ord_range,       name] <=>
  [other.singleton ? 0 : 1, other.name_ord_range, other.name]
end
add_alias(an_alias, context) 点击切换源代码

抽象方法。上下文在其构建阶段调用此方法,以为此已知方法/属性注册新的别名。

  • 创建一个名为 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
add_line_numbers(src) 点击切换源代码

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
aref() 点击切换源代码

此方法的 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_prefix() 点击切换源代码

aref 的前缀,由子类定义。

# File rdoc/code_object/method_attr.rb, line 225
def aref_prefix
  raise NotImplementedError
end
block_params=(value) 点击切换源代码

尝试清理 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
documented?() 点击切换源代码

如果满足以下任一条件,则方法/属性已记录:

  • 它用 :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
full_name() 点击切换源代码

包含命名空间的完整方法/属性名称

# File rdoc/code_object/method_attr.rb, line 300
def full_name
  @full_name ||= "#{parent_name}#{pretty_name}"
end
html_name() 点击切换源代码

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
markup_code() 点击切换源代码

将该方法的令牌流转换为 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
name_prefix() 点击切换源代码

类方法/属性为“::”,实例方法为“#”。

# File rdoc/code_object/method_attr.rb, line 319
def name_prefix
  @singleton ? '::' : '#'
end
output_name(context) 点击切换源代码

用于输出到 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
parent_name() 点击切换源代码

父类的名称,对未编组的方法进行特殊处理

调用父类方法 RDoc::CodeObject#parent_name
# File rdoc/code_object/method_attr.rb, line 360
def parent_name
  @parent_name || super
end
path() 点击切换源代码

此方法的路径,用于 HTML 生成器输出。

# File rdoc/code_object/method_attr.rb, line 353
def path
  "#{@parent.path}##{aref}"
end
pretty_name() 点击切换源代码

带有类/实例指示符的方法/属性名称

# File rdoc/code_object/method_attr.rb, line 339
def pretty_name
  "#{name_prefix}#{@name}"
end
search_record() 点击切换源代码

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
see() 点击切换源代码

一个要查看的方法/属性,特别是如果此方法/属性没有文档的情况下。

它可以是超类或包含模块的方法/属性,包括始终附加到包含模块的 Kernel 模块。

如果没有这样的方法/属性,则返回 nil。不包括 #is_alias_for 方法/属性(如果有)。

如果此方法/属性有文档,则模板可能会生成“另请参阅 …”;如果它没有文档,则会生成“请参阅 …”。

# File rdoc/code_object/method_attr.rb, line 152
def see
  @see = find_see if @see == false
  @see
end
store=(store) 点击切换源代码

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

调用父类方法 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
type() 点击切换源代码

方法/属性的类型(类或实例)

# File rdoc/code_object/method_attr.rb, line 346
def type
  singleton ? 'class' : 'instance'
end