"Error: Undeclared identifier" when trying to return a <Node> from a procedure

"Error: Undeclared identifier" when trying to return a <Node> from a procedure

我 post 这里有一个在 Nim 中使用库 (grim) 的具体问题,但我对基本概念仍然不是很清楚,所以我很欣赏带有解释的解决方案。

我想制作一个返回节点的程序。下面的示例并不是很有用,但说明了这一点:我想 return node 但我显然不知道它是什么类型。

import grim
import sequtils

proc get_a_node_with_label(graph: Graph, label: string): Node =
  for node in graph.nodes:
    if node.label == label:
      return node

var g = newGraph("graph")
let n1 =  g.addNode("n1", %(Name: "first"))
let n2 =  g.addNode("n2", %(Name: "second"))

var aNode = get_a_node_with_label(g, "n2")

我得到一个 Error: undeclared identifier: 'Node',但是循环中“节点”的类型是“节点”,如果我echo node.type

这个时候应该怎么处理类型呢?我应该在过程中声明什么输出?

谢谢 安德里亚

PS:如果问题问得不好,我深表歉意,很乐意在您的指导下改进。

您可能通过 nimble install grim 安装了 grim 库。这给了你今年年初发布的 grim-0.2.0。关键是 Node 在该版本中是私有的,因此您的代码无法访问它。

您可以选择安装最新的代码,这些代码在今年的某个时候 Node 和其他人 public,其中:

$ nimble uninstall grim
$ nimble install grim@#devel

或者您可以在您的计算机中创建对象 public,编辑(可能)~/.nimble/pkgs/grim-0.2.0/grim/graph.nim:

30 Node = ref object

30 Node* = ref object

前者包括最新的代码,并包括 40ish 提交。不利的一面是,您的构建将难以重现,因为您无法固定 grim 版本。

后者应该允许您在本地编译,但如果您打算分发您的代码(即迫使您或您的用户修补严峻的源代码),您将 运行 遇到问题。

您也可以在 github 仓库中提出问题,要求作者标记新版本。


您可以获得 class 为 Node 的对象(又名 Node 对象),但您不能在代码中写入“Node”,创建 Node 对象的唯一方法是通过代码可以访问 Node private class(即在同一个文件中)。它通常是某种 newNodegetNode.

所以你可以在你的代码中得到一个节点,并传递它,但不能写“节点”。例如

import grim

var g = newGraph("graph")
let n1 = g.addNode("n1", %(Name: "first"))

# This works happily
let node = g.node(n1)  # This assigns a Node object to "node"
echo node              # This passes the Node object to a $ proc.

# This fails to compile, albeit being functionally the same code,
# because your program doesn't know what "Node" is.
let node1: Node = g.node(n1)