Julia 中的反射


#1
  • 方法定义:

    • 函数方法:使用函数 methods
    julia> methods(sin)
    # 12 methods for generic function "sin":
    [...]
    
    julia> methods(sin, Tuple{Real})    # 指定参数类型
    # 4 methods for generic function "sin":
    [...]
    
    • 构造函数:使用函数 methods
    julia> methods(Int)
    # 14 methods for generic function "(::Type)":
    [...]
    
    julia> struct Polynomial{R}
               coeffs::Vector{R}
           end
    
    julia> function (p::Polynomial)(x)
               v = p.coeffs[end]
               for i = (length(p.coeffs)-1):-1:1
                   v = v*x + p.coeffs[i]
               end
               return v
           end
    
    julia> (Polynomial isa UnionAll) & (Polynomial{Int} isa DataType)
    true
    
    julia> Polynomial.body.name.mt  # UnionAll 类型的类型
    # 1 method for generic function "(::Polynomial)":
    [1] (p::Polynomial)(x) in Main at REPL[37]:2
    
    julia> Polynomial{Int}.name.mt  # DataType 类型的类型
    # 1 method for generic function "(::Polynomial)":
    [1] (p::Polynomial)(x) in Main at REPL[37]:2
    
  • 源代码:

    • 查找定义:使用函数 which 或宏 @which
    julia> @which sin       # 对变量使用返回其定义所处的模块
    Base
    
    julia> @which sin(1)    # 对函数调用使用返回方法
    sin(x::Real) in Base.Math at special/trig.jl:53
    
    • 浏览定义:使用函数 less 或宏 @less
    julia> @less sin(1)
    
    • 编辑定义:使用函数 edit 或宏 @edit
    julia> @edit sin(1)
    
  • 字段:

    • 类型字段:
    julia> fieldcount(Complex{Int})     # 字段数量
    2
    
    julia> fieldnames(Complex{Int})     # 各个字段名称
    (:re, :im)
    
    julia> fieldname(Complex{Int}, 1)   # 第一个字段的名称
    :re
    
    julia> fieldtypes(Complex{Int})     # 各个字段的类型
    (Int64, Int64)
    
    julia> fieldtype(Complex{Int}, 1)   # 第一个字段的类型
    Int64
    
    • 变量字段:
    julia> a = 0 + im
    0 + 1im
    
    julia> getfield(a, :re)
    0
    
    julia> getfield(a, 1)
    0
    
  • 模块:

julia> names(Base)          # 获取模块内的所有标识符
883-element Array{Symbol,1}:
[...]

julia> getfield(Base, :+)   # 获取模块的指定标识符
+ (generic function with 161 methods)

julia> [n for n in (getfield(Core, s) for s in names(Core))
        if n isa Type]      # 列出模块 Core 中的所有类型
77-element Array{Type,1}:
[...]

julia> [n for n in (getfield(Core, s) for s in names(Core))
        if n isa Function]  # 列出模块 Core 中的所有函数
16-element Array{Function,1}:
[...]