Создание параметрического графика вводит в Scala

Вы должны выбрать только одну из этих таблиц для хранения данных. Поскольку вы создаете отношение, вы сможете получить доступ к данным, когда вам это нужно. Например, если вы сохраняете ревизию у ученика, когда вы просматриваете сведения об ученике, вы можете сделать что-то вроде let studentDetails = await StudentDetails.find({id: id}).populate('student') [Я называю внешний ключ как «студент», потому что он будет иметь больше смысла, когда вы будете заполнять его следующим образом]. Затем вы можете получить доступ ко всей информации из соответствующей записи учащегося, например studentDetails.student.revision

https://sailsjs.com/documentation/concepts/models-and-orm/associations/one-to- один

5
задан ire_and_curses 11 September 2009 в 12:30
поделиться

2 ответа

Очень хороший пример расширяемой структуры графика по http://www.scala-lang.org/node/124

У меня есть ты способы записать Ваш. Обратите внимание, что во всех случаях были некоторые требуемые изменения типа - т.е. параметр типа GNode должен быть ковариантным, и ConcreteGraph должен быть записан и с отличным классом узла и с типом, направляющимся в Узел.

После того, как сделанный, первый способ записать DFS состоит в том, чтобы сделать это методом (это может быть окончательным, если Вы хотите избежать виртуальной отправки наверху).

trait GNode[+Graph] {
//... functions to get edges from this vertex, etc. ...
}

trait Graph {
  type Node <: GNode[Graph]

  def dfs(nodeAction : Node => Unit) = print("dfsing!")
}

class ConcreteGraph extends Graph {
  class CGNode extends GNode[ConcreteGraph]
  type Node <: CGNode
}

new ConcreteGraph dfs {node => println("foo")}

Второе, с DFS не метод, кажется, требует просто, чтобы немного дополнительного типа, подсказывающего, использовало его.

def dfs[G <: Graph](graph : G, nodeAction : G#Node => Unit) = print("dfsing!")

dfs[ConcreteGraph](new ConcreteGraph, {node => println("foo")})

Третий путь с DFS с приправой карри. Из-за пути работает вывод типа Scala, который на самом деле приводит к более чистому интерфейсу

def dfs[G <: Graph](graph : G)(nodeAction : G#Node => Unit) = print("dfsing!")

dfs(new ConcreteGraph){node => println("foo")}
7
ответ дан 13 December 2019 в 05:43
поделиться

Я не вижу, почему все эти параметры необходимы. Внутренние классы в Scala (в отличие от Java) имеют типы, которые зависят от определенного экземпляра внешнего объекта. В особенности:

trait Graph {
  trait Node
  def dfs(n: Node) = println("DFSing!")
}

val graphA = new Graph {}
val nodeA = new graphA.Node {}
val graphB = new Graph {}
val nodeB = new graphB.Node {}
graphA.dfs(nodaA)  // prints "DFSing!"
graphB.dfs(nodeB)  // prints "DFSing!"
graphA.dfs(nodeB)  // type mismatch; found: graphB.Node required: graphA.Node
graphB.dfs(nodeA)  // type mismatch; found: graphA.node required: graphB.Node

Предоставленный, Вы не можете определить DFS за пределами графика, если Вы хотите зависеть от подчиненных типов.

5
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: