Nim 中可变大小且可容纳不同类型的数组类型有哪些?

问题描述 投票:0回答:1

Nim 是继 Python 之后我的第二语言。 Python 有一个通用的数组类型,即“列表”类型。它的尺寸可变,可以容纳任何类型。目前正在整理和研究Nim学习资料。看起来对于所有情况都有许多不同类型的数组 - 元组、数组、开放数组、序列等。研究起来有点混乱。我还没弄清楚Nim中是否存在可变大小的数组,以及可以包含不同类型数据的数组? python 中是否有类似的“列表”类型,它可以调整大小并容纳不同类型的数据?

“描述您尝试过的操作、预期会发生什么以及实际结果。至少 20 个字符。” - 我已经尝试并将继续尝试理解教育材料。我期望并且继续期望我能够了解哪些类型的数组可以改变其大小,以及哪些类型可以容纳不同类型的数据。还希望从 python 中获得“列表”的模拟,它可以改变其大小并同时容纳不同的类型。

arrays types sequence nim-lang
1个回答
0
投票
  1. 数组就像c数组一样,是一块静态内存,但是您可以在运行时动态分配它,无论您想要什么大小。那么你就拥有了称为 seq(动态数组)的内存块的结构。它是一种数据结构,当没有更多空间在其中添加新项目时,它会重新分配内存。

  2. nim 中的
  3. tuple 更像是 python 中的namedtuple,而不是默认的 python 元组。您必须为每个字段指定一个名称,但仍然可以通过数字对其进行索引。

  4. 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
© www.soinside.com 2019 - 2024. All rights reserved.