0

我有一个flatmap正在经历的Sequence,我正在使用case它来识别 中的不同元素Sequence,并用其他东西替换这些元素。但是,在某些情况下,我还想增加一个计数器变量。我可以在里面放一条指令case吗?似乎我不能,因为里面的case内容将替换Sequence. 这可能吗?这是我尝试过的代码,但它不起作用:

var location = 0
code.flatMap {
        case Define(label) => Word("")                            // Return an empty Word, don't increase location
        case CodeWord(word) => word; location = location + 4    // Return the Word and increase location by 4
        case Use(label) => Word(Assembler.encodeUnsigned(labelToValue(label))); location = location + 4
                                                                  // Convert label into Seq, then into Word. Increase location.
        case BeqBne(bits, label) =>{ // Are brackets necessary?
            Word(bits ++ encodeUnsigned(labelToValue(label) - (location + 4))); location = location + 4 }
        case _ => require(false, s"Encountered unsupported code $code.");
      }

更新变量很重要,location因为如您所见,case BeqBne(bits, label)我需要使用location. 我应该创建一个函数之外的flatmap所有这些东西,然后只调用该函数并在每种情况下传递值flatmap吗?任何建议表示赞赏。

4

1 回答 1

2

在代码块中指定多个语句时,最后一个语句用作返回值。因此,您需要先增加位置变量,然后再创建 Word 结果。

例如,改变:

case Use(label) => {
  Word(Assembler.encodeUnsigned(labelToValue(label)));
  location = location + 4
}

到:

case Use(label) => {
  location = location + 4;
  Word(Assembler.encodeUnsigned(labelToValue(label)));
}

或者,如果您需要在创建结果后增加位置,则将结果存储在变量中:

case BeqBne(bits, label) => {
  val result = Word(bits ++ encodeUnsigned(labelToValue(label) - (location + 4)));
  location = location + 4;
  result
}
于 2015-10-07T22:44:58.270 回答