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