4

私は Scala と funcprog が初めてです。

私はコードを持っています (あなたの何人かはそれを認識するかもしれません):

    trait SwingApi {

      type ValueChanged <: Event

      val ValueChanged: {
        def unapply(x: Event): Option[TextField]
      }
      ...
     }

val ValueChanged: {...} が何であるかを理解していません。

この投稿から、私は一種のことを学びました

type ValueChanged <: Event

val ValueChanged: {
            def unapply(x: Event): Option[TextField]
          }

これらは異なる名前空間などにあり、 タイプ ValueChangedEventの抽象サブタイプであるため、2 つの無関係なものです。

それでは、Scala ワークシートで試してみます。

type myString <: String

 val myString: {
    def myfunc(x: String): String
  }

そして、「クラスのみが宣言されたメンバーと未定義のメンバーを持つことができます」というエラーが表示されます...同様の構造ではありませんか?

最後に、質問は次のとおりです。

  • コードのval ValueChanged部分のValueChangedとは何ですか?

  • タイプ ValueChanged <: イベントとは本当に無関係ですか

  • この構文の意味:

    val myVal:{def func{x:T}:T}

? ここでの値の名前、その型、および実際の値は何ですか?

ありがとう!

4

1 に答える 1

7
{def unapply(x: Event): Option[TextField]}

は構造型であり、Event を Parameter とし、Option[TextField] を戻り値とする unapply メソッドを持つ任意のオブジェクトを受け入れることを意味します。ほとんどの場合、ダックタイピングと同様に使用されます。たとえば、次のようになります。

def foo(canQuack: {def quack(): Unit}) = {
  canQuack.quack()
}
object Bar{
   def quack(): Unit = print("quack")
}
object Baz{
   def bark(): Unit = print("bark")
}
foo(Bar) //works
foo(Baz) //compile error

それで

type StructuralType = {def unapply(x: Event): Option[TextField]}
val ValueChanged: StructuralType

ValueChanged という名前と Type StructuralType で val を宣言しますが、値を割り当てません。これは、特性または抽象クラスでのみ意味があります。そのため、例が機能しません。

だから何

trait SwingApi {
...
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
...
}

つまり、特性 SwingApi は、ValueChanged という名前の val を持つオブジェクト/クラスにのみ適用でき、値が割り当てられていれば unapply メソッドがあります。

trait SwingApi {
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
}
//works:
object Bar extends SwingApi{
  val ValueChanged = {
    def unapply(x: Event): Option[TextField] = None
  }
}
//compile error:
object Baz extends SwingApi{
  val ValueChanged = {
    //wrong name
    def foo(x: Event): Option[TextField] = None
  }
}
//compile error:
object Baz2 extends SwingApi{
  val ValueChanged = {
    //wrong input/output type
    def unapply(): Unit = {}
  }
}

すべてのコードはテストされていません

于 2015-05-17T07:17:01.220 に答える