1

変更可能な変数をできるだけ避けようとしていますが、時にはそれが難しすぎると感じることがあり、非常に複雑なコードで終わりたくありません

それにもかかわらず、私はそれを行うためにこの方法を見つけましたが、それは確かに不正行為のように感じます

クエリを解析していて、field!value が見つかったので、それを field:<>value に変換してから処理を続けたいので、ミュータブルを避けるために、または少なくとも彼らは閉じ込められた...

val (operator, negated) = {
  var operator = ConditionOperator.toConditionOperator(parsedOperator)
  var negated = parsedNegated == "!"
  // field!value => field notEqual value
  if (negated && operator == ConditionOperator.Unknown) {
    negated = false
    operator = ConditionOperator.NotEqual
  }
  (operator, negated)
}

これは正しい方法ですか?または、この種のことを達成するためのより慣用的な(そして明確な!)方法はありますか?

4

3 に答える 3

6

var可変なので、これは確かに不正行為です!

これを修正する方法は、単純に if ステートメントの結果を直接返すことです。

val (operator, negated) = {
  val operator = ConditionOperator.toConditionOperator(parsedOperator)
  val negated = parsedNegated == "!"
  // field!value => field notEqual value
  if (negated && operator == ConditionOperator.Unknown)
    (ConditionOperator.NotEqual, false)
  else
    (operator, negated)
}
于 2012-09-08T21:05:51.323 に答える
3

それを行う典型的な方法は、実際には必要ないため、一時変数も使用しないことです。

val operator = ConditionOperator.toConditionOperator(parsedOperator)
val negated = parsedNegated == "!"
if (!negated || operator != ConditionOperator.Unknown) (operator, negated)
else (ConditionOperator.NotEqual, false)
于 2012-09-08T21:06:07.083 に答える
1

取り出すことでロジックを単純化できますnegated。そうすれば、パターン マッチングは以前よりもきれいになります。

val negated = parsedNegated == "!"
val operator = ConditionOperator.toConditionOperator(parsedOperator) match {
  case op if negated && op == ConditionOperator.Unknown => ConditionOperator.NotEqual
  case op => op
}
于 2012-09-08T21:29:35.593 に答える