Struct对我来说真的非常有用,但是当我想深入了解它时,我感到很惊讶。
请查看以下代码和结果。
代码:
Song = Struct.new(:name, :artist, :duration)
def get_super_classes(klass)
res = []
while klass = klass.superclass
res << klass
end
return res
end
p get_super_classes(Song)
p Song.class
结果:
[Struct, Object, BasicObject]
Class
结果显示Song是Struct的子类和Class的对象。 这种行为不是我对常规新方法的期望,所以我对此感到惊讶?: - )
答案 0 :(得分:1)
Object
是所有Ruby对象的默认根。它继承自BasicObject
,因此您的方法的结果将包括[Object, BasicObject]
所有Ruby对象。
Struct
类用作类生成器,当您调用Struct.new
时它会生成一个新类,因此Song
是一个类。在其他一些语言中,这是不可能完成的,这就是为什么他们引入特殊语法来定义结构。 Ruby中没有必要这样做。