このトピックのシーケンスでは、ブロックをスカラに構成できるシステムを追跡しているので、パターンマッチングを使用して書き換えルールシステムを作成できます。
しかし、私は立ち往生しています。
私はこのクラスを持っています:
abstract class Block(n: String, in: List[Input], out: List[Out]){
def name = n; def outputs = out; def inputs = in
}
case class GroupBlock(n: String, blocks: List[Block], in: List[Input],
out: List[Out]) extends Block(n, in, out)
case class StandardBlock(n: String, in: List[Input], out: List[Out])
extends Block(n, in, out)
abstract class Point(n: String){ def name = n }
case class Input(n:String) extends Point(n)
abstract class Out(n: String) extends Point(n)
case class Output(n:String) extends Out(n)
case class Connection(connectedInput: Input, n: String) extends Out(n)
ここで、ディスプレイのないこの例があると想像してください。
これにマッピング:
val inputA = Input("sumA")
val inputB = Input("sumB")
val outputB = Output("B")
val sumAB =
GroupBlock("GroupedSum",
StandardBlock("Sum", List(inputA, inputB), List(outputB)) ::
StandardBlock("Input Provider", null, Connection(inputA, "A")::Nil ) ::
StandardBlock("Input Provider", null, Connection(inputB, "B")::Nil ) ::
Nil,
null,
List(outputB))
だから...私は言うことができるようにしたい:2"Integer providers"
がその時と接続されている"Sum"
場合...
私は、パターンマッチングを使用して、「入力プロバイダー」がこれで存在することを識別できました。
sumAB match{
case GroupBlock(_,
StandardBlock("Input Provider", null, _ :: Connection(input, _) :: _ ) :: _,
_, _)
=> ...
case GroupBlock(_,
StandardBlock("Input Provider", null, Connection(input, _) :: _ ) :: _,
_, _)
=> ...
//Covering 2 more cases where the order on the list matters
}
StandardBlock
「リストに名前が含まれているケースを見つけてください」とはどうすればよい"Input Provider"
ですか?それが私の主な問題の1つだからです。可能なすべての組み合わせを指定する必要があります...今、私は次のようなことをしたかった
case GroupBlock(_,
StandardBlock("Input Provider", null, Connection(input, _) ::
StandardBlock("Sum", inputList, _ ) :: _,
_, _)
ただし、これは「「入力プロバイダー」がリストの先頭にあり、Sumブロックがその「Sum」の後に続く場合を見つけてください」という意味です。そして、私が欲しいのは、「「合計」と同じリストに「入力プロバイダー」が存在するケースを見つけてください。
リスト内のこの種の「クエリ」は、入力プロバイダーが見つかったSumブロックに接続されているかどうかを確認するのにも役立ちます。その変数を使用して、がinputListinput
にある場合を尋ねることができます。input