如何获得一个类的所有属性

问题描述 投票:0回答:1

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

比如说.类的属性,我想有一种方法可以直接获得类的属性。

class Location
  property latitude : Float64
  property longitude : Float64
end

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

谢谢你

crystal-lang
1个回答
1
投票

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 是一个宏 在编译时将被解包为gettersetter方法,结果你可以在方法列表中找到它。


2
投票

我还发现这样的方法

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]


© www.soinside.com 2019 - 2024. All rights reserved.