Есть ли оператор - - (минус минус) в Scala? - PullRequest
4 голосов
/ 06 апреля 2020

Я сталкивался с этим оператором в Scala реализации графа (который вы можете найти в примере здесь , где два списка объединяются оператором --, а также двумя картами.

abstract class GraphBase[T, U] {
  case class Edge(n1: Node, n2: Node, value: U) {
    def toTuple = (n1.value, n2.value, value)
  }
  case class Node(value: T) {
    var adj: List[Edge] = Nil
    // neighbors are all nodes adjacent to this node.
    def neighbors: List[Node] = adj.map(edgeTarget(_, this).get)
  }

  var nodes: Map[T, Node] = Map()
  var edges: List[Edge] = Nil

  // If the edge E connects N to another node, returns the other node,
  // otherwise returns None.
  def edgeTarget(e: Edge, n: Node): Option[Node]

  override def equals(o: Any) = o match {
    case g: GraphBase[_,_] => (nodes.keys.toList -- g.nodes.keys.toList == Nil &&
                               edges.map(_.toTuple) -- g.edges.map(_.toTuple) == Nil)
    case _ => false
  }
  def addNode(value: T) = {
    val n = new Node(value)
    nodes = Map(value -> n) ++ nodes
    n
  }
}

Мой текущий интерпретатор не распознает его, поэтому мне интересно, откуда взялся этот оператор? Означает ли это вычитание списка? Это действительный Scala код?

1 Ответ

2 голосов
/ 06 апреля 2020

Вы можете изменить реализацию метода equals, чтобы избежать использования --:

override def equals(o: Any) = o match {
  case g: GraphBase[_,_] => (nodes.keySet == g.nodes.keySet &&
                             edges.map(_.toTuple).toSet == g.edges.map(_.toTuple).toSet)
  case _ => false
}
...