如何获取 class 的所有 属性

How to get all property of a class

我希望获得 class 的所有属性。 当我漂亮地打印一个对象时,我拥有该对象的所有信息,所以我想有一种方法可以直接获取 class 的属性。

例如:

class Location
  property latitude : Float64
  property longitude : Float64
end

如何确定 Location 具有纬度和经度作为属性。

谢谢

Crystal 没有用于检索方法的内置选项,但您可以定义它:

class Location
  property latitude  : Float64
  property longitude : Float64

  def initialize(@latitude, @longitude)
  end

  # Call this on class instance
  def methods
    {{ @type.methods.map(&.name).select { |m| !m.includes?("=") }.map(&.stringify)  }}
  end
end

loc = Location.new(-13.8948894, 33.775556)
pp loc.methods #=> ["latitude", "longitude", "initialize", "methods"]

property is a macro 将在编译中解包为 getter/setter 方法,因此您可以在方法列表中找到它。

我也是这样找到的

class Location
  property latitude  : Float64
  property longitude : Float64

  def initialize(@latitude, @longitude)
  end

  # Call this on class instance
  def methods
     {{ pp! @type.instance_vars  }}
  end
end

loc = Location.new(-13.8948894, 33.775556)
pp loc.methods #=> @type.instance_vars # => [latitude, longitude]