2

次の構造型のコードをテストしました。

trait Data

object Main
{
  def main(args: Array[String]): Unit =
  {
    val data = new Data {
      val value: Int = 1
    }

    println(data.value)
  }
}

Scala 2.13.2 では正常にコンパイルされましたが、Dotty/Scala3 では失敗しました。Dotty/Scala3で構造型を使用するには? ありがとう!

4

1 に答える 1

5

私が見たものから:

  • 推論が変更されたため、型を明示的に絞り込む必要があります。
    val data: Data { val value: Int } = new Data {
      val value: Int = 1
    }
    
    dotr実行して、推測された型が何であるかを確認すると 、はっきりとわかります
  • 改良を利用するには、リフレクションを気にしないことをコンパイラに知らせる必要があります
    import reflect.Selectable.reflectiveSelectable
    

それを一緒に入れて:

import reflect.Selectable.reflectiveSelectable

trait Data

object Main
{
  def main(args: Array[String]): Unit =
  {
    val data: Data { val value: Int } = new Data {
      val value: Int = 1
    }

    println(data.value)
  }
}

これをしなければならない理由は、洗練されたくない場合に、洗練されたことが何度もあったためだと思います (たとえば、すべてのテスト フィクスチャのテストnew Fixture { ... }は不必要に洗練された型でした)。もう 1 つは、洗練が (Scala 2 で) 洗練にアクセスするときにリフレクションを使用することです。これはパフォーマンスの低下を引き起こします。したがって、これは偶然ではなく意識的に行うべきことです。

Scala 3 では、構造型はdynamicsSelectableを使用して実装されますが、これにはtraitでの混合が必要です。そのため、暗黙の変換をインポートして Scala 2 のように機能させる必要があります。@Dmytro Mitin の提案に従ってscala.reflect.Selectable.reflectiveSelectable追加する前のように機能させたい場合は、リフレクションを追加します。import reflect.Selectable.{ given _ }

パッケージにエクスポートするなどしてグローバルに実行することもできますが、それは自己責任で行ってください。

于 2020-06-03T09:44:50.023 に答える