0

カスタムの型指定されていない式の新しい抽象構文ツリーを作成していて、その上で==演算子を次のように再定義したいと思いました。

trait Expression {
  def ==(other: Expression): Expression = Equality(this, other)
  def !=(other: Expression): Expression = Inequality(this, other)
}
case class Equality(e1: Expression, e2: Expression) extends Expression
case class Inequality(e1: Expression, e2: Expression) extends Expression
case class Integer(e: Int) extends Expression
case class Boolean(e: Boolean) extends Expression

私が今遭遇する唯一の問題は、そのような表現の無効性をテストすることです。たとえば、私がこれを書くとき:

val formula: Expression = someFunctionReturingAnExpression
if(formula != null) {
  ... use the formula.
}

メソッドをにjava.lang.NullPointerException適用しているため、をスローします。!=formula

!=の表現可能性とヌルチェックをどのように行うかについての良いアイデアはありますか?

4

1 に答える 1

2

==そこにある!=演算子をオーバーロードしています。あなたが示したコードは、if句で式をブール値にキャストできないため、実際にはコンパイルされません。したがって、コンパイラが次の==演算子を使用するように、nullでダウンキャストを使用できAnyます。

if (formula != null.asInstanceOf[Any]) {
    println("hello")
}

上記の式は私のために働きます。

次の場所から参照等式演算子を使用することもできますAnyRef

if (formula eq null) {
    println("hello")
}

if (formula ne null) {
    println("!hello")
}

また、ziggystarとDylanのコメントを購読します-別の演算子名(===たとえば)を使用する必要があり、使用しないでくださいnull-Option代わりに使用してください。

于 2012-11-28T13:23:16.933 に答える