传统上,我使用 C++ 和 Java 进行编程,现在我开始学习 Ruby。
那么我的问题是,像 ruby 这样的语言如何在内部实现它们的数组和散列数据结构,以便它们可以同时保存任何类型?我知道在 Java 中,每个类都派生自对象这一事实可能是实现它的一种方法,但我想知道是否还有另一种方法。例如,在c++中,如果我想实现一个动态数组,可以同时保存多种类型的值(没有关系),我该怎么做?
澄清一下,我指的不是泛型编程或模板,因为它们只是为一个类型创建一个新的集合接口(interface)。我指的是这样的结构:
array = [1, "hello", someClass];
最佳答案
它们中的大多数通过创建 vector
(或 list
、deque
等)与您在 C++ 中获得的大致相同。 ) 的 boost::any
,或类似的东西。
也就是说,它们基本上会在每种类型的对象存储在内存中时附加一些标签。当他们存储一个对象时,他们存储标签。当他们读取一个对象时,他们会查看标签以确定该对象的类型。当然,它们也在内部处理其中的大部分,因此您不必编写代码来确定您刚刚从集合中检索到的对象类型。
如果不清楚:“标签”只是分配给每种类型的唯一编号。如果您正在处理的系统具有原始类型,它通常会为每个类型预先分配一个类型编号。同样,您创建的每个类(class)都会分配一个唯一编号。
要在 C++ 中做到这一点,您通常会创建一个中央标记注册表。当您注册一个类型时,您会收到一个唯一的编号,用于标记该类型的对象。当一种语言直接支持这一点时,它会自动执行注册类型并为每种类型选择唯一标记的过程。
虽然这可能是实现此类事情的最常见方法,但绝对不是唯一的方法。例如,也可以为特定类型指定特定的存储范围。当您分配给定类型的对象时,它总是从该类型的地址范围分配。当您创建“对象”集合时,您实际上并不是在存储对象本身,而是在存储包含对象地址的内容。由于对象是按地址分隔的,因此您可以根据指针的值确定对象的类型。
关于c++ - 同时持有不同类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592025/