"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(即在同一个文件中)。它通常是某种 newNode
或 getNode
.
所以你可以在你的代码中得到一个节点,并传递它,但不能写“节点”。例如
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)
我 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(即在同一个文件中)。它通常是某种 newNode
或 getNode
.
所以你可以在你的代码中得到一个节点,并传递它,但不能写“节点”。例如
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)