Struct.new创建Struct的子类而不是Struct的对象实例,这是否违反了最小的意外原则?

时间:2013-11-22 05:09:44

标签: ruby struct

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的对象。 这种行为不是我对常规新方法的期望,所以我对此感到惊讶?: - )

1 个答案:

答案 0 :(得分:1)

Object是所有Ruby对象的默认根。它继承自BasicObject,因此您的方法的结果将包括[Object, BasicObject]所有Ruby对象。

Struct类用作类生成器,当您调用Struct.new时它会生成一个新类,因此Song是一个类。在其他一些语言中,这是不可能完成的,这就是为什么他们引入特殊语法来定义结构。 Ruby中没有必要这样做。