首页 > 解决方案 > Julia中的漂亮物体打印机

问题描述

我想在 Julia 中编写一个函数,它可以采用任何复合类型并漂亮地打印嵌套成员的名称、它们的类型和它们的值,我想把这个函数放在一个包中供社区使用。

想象一个用户有以下结构:

struct House
    value::Int32
    rooms::Int32
    number::Int32
end

struct Street
    name::String
    houses::AbstractArray{House}
end

struct Town
    name::String
    streets::AbstractArray{Street}
end

town = Town(<initialization code here>)

这个用户可以调用PrettyPrinter.print(town),它应该输出类似

town::Town
    name::String = "London"
    streets[1]::Street
        name::String = "Downing Street"
        houses[1]::House
            value::Int32 = 100000
            rooms::Int32 = 5
            number::Int32 = 10
        houses[2]::House
            value::Int32 = 300000
            rooms::Int32 = 6
            number::Int32 = 40210

但是当然,PrettyPrinter 包不能解析结构实现,它必须通过低级别的 Julia 技巧来完成它的工作。我的问题不在于递归编程。

问题:如何访问成员名称、类型和值?

标签: julia

解决方案


此功能已内置到dump函数中:

julia> t = Town("London", [Street("Downing Street",[House(100000,5,10),House(300000,6,40210)])])
Town("London", Street[Street("Downing Street", House[House(100000, 5, 10), House(300000, 6, 40210)])]);

julia> dump(t)
Town
  name: String "London"
  streets: Array{Street}((1,))
    1: Street
      name: String "Downing Street"
      houses: Array{House}((2,))
        1: House
          value: Int32 100000
          rooms: Int32 5
          number: Int32 10
        2: House
          value: Int32 300000
          rooms: Int32 6
          number: Int32 40210

但是,如果要查询数据,可以使用以下fieldnames函数:

julia> fieldnames(typeof(t))
(:name, :streets)

julia> getfield(t, :name)
"London"

推荐阅读