6

C# null 合体演算子 '??' の実装をどこかで見つけました。

implicit def coalescingOperator[T](pred: T) = new {
  def ??[A >: T](alt: =>A) = if (pred == null) alt else pred
}

a ?? bその後、 which meansのように使用できますif (a == null) b else a

クラス ファイルを逆コンパイルした後、リフレクションを含むコードが生成されることがわかりました (Scala 2.8.1)。

リフレクションを生成する理由と、リフレクションを生成しないようにそのコードを変更することは可能ですか?

4

1 に答える 1

12

Scala には、Java と同じ無名クラスの概念がありません。みたいなことを言うと

new {
  def fish = "Tuna"
}

次に、新しいメソッドのすべての使用を構造型が必要であると解釈します。つまり、

def[T <: {def fish: String}](t: T) = t.fish

共通のスーパークラスがないため、リフレクションを使用する必要があります。なぜこのようになっているのかわかりません。パフォーマンスのために行うのはまったく間違ったことであり、通常は必要なものではありません。

とにかく、修正は簡単です。匿名クラスではなく、実際のクラスを作成します。

class NullCoalescer[T](pred: T) {
  def ??[A >: T](alt: => A) = if (pred == null) alt else pred
}
implicit def anyoneCanCoalesce[T](pred: T) = new NullCoalescer(pred)

2.10でも間違いなく間違った動作をしますが、(1) この方法でリフレクションを使用すると警告が表示されます (したがって、少なくともいつ発生したかがわかります) オフにしない限り、(2) できる短いバージョンを使用して、ボイラープレートを追加するだけimplicit class /* blah blah */の をスキップしてください。implicit def

于 2012-05-28T16:33:04.097 に答える