Nano Hash - криптовалюты, майнинг, программирование

Ошибка: необъявленный идентификатор при попытке вернуть ‹Node› из процедуры

Я публикую здесь конкретную проблему с использованием библиотеки (мрачной) в Nim, но основные концепции все еще не очень ясны для меня, поэтому я ценю решение с объяснением.

Я хотел бы сделать процедуру, возвращающую node. Приведенный ниже пример не очень полезен, но показывает суть: я хочу 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: Прошу прощения, если вопрос задан неправильно, и я буду рад улучшить его под вашим руководством.

20.08.2020

Ответы:


1

Вероятно, вы установили библиотеку grim через nimble install grim. Это дало вам grim-0.2.0, выпущенный в начале этого года. Дело в том, что Node в этом выпуске был закрытым, поэтому ваш код не может получить к нему доступ.

Вы можете установить последний код, который в какой-то момент этого года сделал Node и других общедоступными, с помощью:

$ nimble uninstall grim
$ nimble install grim@#devel

Или вы можете сделать объект общедоступным на своем компьютере, отредактировав (вероятно) ~/.nimble/pkgs/grim-0.2.0/grim/graph.nim:

30 Node = ref object

to

30 Node* = ref object

Первый включает в себя последний код и включает 40 коммитов. С другой стороны, вашу сборку будет сложно воспроизвести, потому что вы не сможете закрепить версию grim.

Последнее должно позволить вам компилировать локально, но вы столкнетесь с проблемами, если собираетесь распространять свой код (т. е. заставлять вас или ваших пользователей исправлять мрачный исходный код).

Вы также можете открыть задачу в репозитории github, попросив автора пометить новую версию.


Вы можете получить объекты с классом Node (также известные как объекты Node), но вы не можете написать Node в своем коде, и единственный способ создать объект Node — через код, который имеет доступ к частному классу Node (т.е. в том же файле) . Обычно это какой-то newNode или getNode.

Таким образом, вы можете получить Node внутри своего кода и передавать его, но не можете написать Node. Например.

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)
20.08.2020
  • Так что, если бы урок оставался закрытым, его невозможно было бы пройти. Но вы можете назначить его vars. 20.08.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..