Nim 是继 Python 之后我的第二语言。 Python 有一个通用的数组类型,即“列表”类型。它的尺寸可变,可以容纳任何类型。目前正在整理和研究Nim学习资料。看起来对于所有情况都有许多不同类型的数组 - 元组、数组、开放数组、序列等。研究起来有点混乱。我还没弄清楚Nim中是否存在可变大小的数组,以及可以包含不同类型数据的数组? python 中是否有类似的“列表”类型,它可以调整大小并容纳不同类型的数据?
“描述您尝试过的操作、预期会发生什么以及实际结果。至少 20 个字符。” - 我已经尝试并将继续尝试理解教育材料。我期望并且继续期望我能够了解哪些类型的数组可以改变其大小,以及哪些类型可以容纳不同类型的数据。还希望从 python 中获得“列表”的模拟,它可以改变其大小并同时容纳不同的类型。
数组就像c数组一样,是一块静态内存,但是您可以在运行时动态分配它,无论您想要什么大小。那么你就拥有了称为 seq(动态数组)的内存块的结构。它是一种数据结构,当没有更多空间在其中添加新项目时,它会重新分配内存。
tuple 更像是 python 中的namedtuple,而不是默认的 python 元组。您必须为每个字段指定一个名称,但仍然可以通过数字对其进行索引。
nim 是静态类型语言,seq 或数组只能包含相同类型的值。但您始终可以使用可变参数对象、OOP 和带有强制转换的指针
使用可变参数对象将如下所示。例如 nim 中的 json 库就使用这种方法
type
MyType = enum
Int
Str
A = object
case t: MyType
of Int:
datai: int
of Str:
datas: string
var arr: array[2, A]
arr[0] = A(t: Int, datai: 42)
arr[1] = A(t: Str, datas: "hello")
for obj in arr:
case obj.t
of Int:
echo "int obj:", obj.datai
of Str:
echo "str obj:", obj.datas
使用 OOP 也一样
type
DynObj = ref object of RootObj
Int = ref object of DynObj
data: int
Str = ref object of DynObj
data: string
var arr: array[2, DynObj]
var i = new Int
i.data = 1
arr[0] = i
var s = new Str
s.data = "hello"
arr[1] = s