2

署名付きのメソッドが与えられた場合

def declareParam[T](name: String, setter: T => _, getter: => T): Unit

そして消費コード

var v = 1
params.declareParam("someName", v_=, v)

すべてが正常にコンパイルされますが、私は scala に慣れていないため、期待どおりに動作するかどうかわかりません。v を変更し、後で他のコードが宣言されたパラメーターを取得し、格納されたゲッターを呼び出すと、新しい値が返されますか、それとも 1 (declareParam を呼び出したときの値) が返されますか?

4

1 に答える 1

3

これは、クラス定義でのみ機能します。

この場合var vは変数ではなく、フィールドです。

これを試して:

{
  var v = 1
  params.declareParam("someName", v_=, v)
}

コンパイル エラーが発生します。

varフィールドは、getter および setter メソッドを使用して実装されます。したがって、スコープには と の 2 つのメソッドがdef v_=(i: Int): Unitありdef v(): Intます。

Scala コンパイラーは、メソッドを関数に暗黙的に変換できます。たとえば、次のようになります。

(1 to 10).foreach{println}

これはオブジェクトprintlnからのメソッドです。Predefコンパイラは次のような関数を作成します。

(1 to 10).foreach{ i => Predef.println(i)}

したがって、コードは次のことを意味します。

params.declareParam("someName", i => this.v_=(i), () => this.v)
于 2013-08-05T17:36:34.513 に答える