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

Ruby Struct.new创建Struct的子类而不是Struct的对象实例,;这是否违反了最小意外原则?,ruby,struct,Ruby,Struct,Struct对我来说确实非常有用,但当我想深入研究它时,我会感到惊讶 请看下面的代码和结果 代码: 结果表明Song是Struct的一个子类,是Class的一个对象。 这种行为不是我从常规的新方法中所期望的,所以我对此感到惊讶?:-)对象是所有Ruby对象的默认根。它继承自BasicObject,因此方法的结果将包括所有Ruby对象的[Object,BasicObject] Structclass用作类生成器,当您调用Struct时,它会生成一个新类。new因此Song是一个类。在其他一些语言中

Struct对我来说确实非常有用,但当我想深入研究它时,我会感到惊讶

请看下面的代码和结果

代码:

结果表明Song是Struct的一个子类,是Class的一个对象。
这种行为不是我从常规的新方法中所期望的,所以我对此感到惊讶?:-)

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


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

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


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

您希望得到什么?我不明白你所说的“常规新方法”是什么意思
Struct.new(:name,:artist,:duration)。祖先=>[#,Struct,Enumerable,Object,Kernel,BasicObject]
更简单。关于“常规新方法”,我的意思是它通常返回调用new的类的对象,而不是子类。哦,我明白了,你是指方法
new
。(我把它理解为“新方法”。)是的,
new
创建一个属于子类的类的实例是不寻常的。但是你有什么问题吗?我的问题可能是:将Struct的方法“new”命名为“generate”可能更合适,也不奇怪了?如果你没有读过这篇文章,你应该这样做。除此之外,征求意见的问题是不允许的。如果这件事被否决或被“搁置”,不要感到惊讶。你期待什么?我不明白你所说的“常规新方法”是什么意思
Struct.new(:name,:artist,:duration)。祖先=>[#,Struct,Enumerable,Object,Kernel,BasicObject]
更简单。关于“常规新方法”,我的意思是它通常返回调用new的类的对象,而不是子类。哦,我明白了,你是指方法
new
。(我把它理解为“新方法”。)是的,
new
创建一个属于子类的类的实例是不寻常的。但是你有什么问题吗?我的问题可能是:将Struct的方法“new”命名为“generate”可能更合适,也不奇怪了?如果你没有读过这篇文章,你应该这样做。除此之外,征求意见的问题是不允许的。如果这个方法被否决或被“搁置”,请不要感到惊讶。我认为将“new”命名为“generate”可能更合适,不再令人惊讶。事实上,这会更加混乱。需要新数组时,可以调用
Array.new
。需要新哈希时调用
Hash.new
,需要新结构时调用
Struct.new
。您甚至可以调用
Class.new
来获取一个新类。我调用Array.new,然后获取一个Array对象。但是我调用Struct.new,我得到Struct的一个子类,“Struct”一词在这里重载。在产生术语“struct”的C风格编程中,这个词可以指结构化数据类型的定义,也可以指此类数据类型的实例。在问题中,类
Song
是一个结构。将
Song
的实例也调用为struct是正确的。这是同一个词的两个意思。我认为将方法“new”命名为“generate”可能更合适,也不再令人惊讶。实际上,这会更令人困惑。需要新数组时,可以调用
Array.new
。需要新哈希时调用
Hash.new
,需要新结构时调用
Struct.new
。您甚至可以调用
Class.new
来获取一个新类。我调用Array.new,然后获取一个Array对象。但是我调用Struct.new,我得到Struct的一个子类,“Struct”一词在这里重载。在产生术语“struct”的C风格编程中,这个词可以指结构化数据类型的定义,也可以指此类数据类型的实例。在问题中,类
Song
是一个结构。将
Song
的实例也调用为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