4

このスレッドに関連

これら2つの定義の違いについてはまだはっきりしていません。

val foo = (arg: Type) => {...}
def(arg:Type) = {...}

私が理解しているように:

1)valバージョンは1回バインドされ、コンパイル時
に単一のFunction1インスタンスが作成さ
れ、メソッドパラメーターとして渡すことができます。


2)defバージョンは、呼び出しごとに作成された新しいメソッドインスタンスの呼び出しごとに新たにバインドされます。

上記が当てはまる場合、実行する操作が実行時の状態に依存しない場合に、なぜdefバージョンを選択するのでしょうか。

たとえば、サーブレット環境では、接続しているクライアントのIPアドレスを取得したい場合があります。この場合、もちろんコンパイル時に接続されたクライアントがないため、defを使用する必要があります。

一方、コンパイル時に実行する操作をよく知っており、不変で実行できますval foo = (i: Type) => {...}

経験則として、実行時の状態の依存関係がある場合にのみdefsを使用する必要がありますか?

明確にしてくれてありがとう

4

1 に答える 1

4

実行時の状態の依存関係が何を意味するのか完全にはわかりません。valsとsはどちらもdef字句スコープを閉じることができるため、このように無制限になります。では、Scala 以前に質問と回答があった)defのメソッド( s)と関数(sとして)の違いは何ですか?val

defをパラメータ化できます

例えば:

object List {

  def empty[A]: List[A] = Nil     //type parameter alllowed here

  val Empty: List[Nothing] = Nil  //cannot create a type parameter
}

その後、電話をかけることができます:

List.empty[Int]

しかし、私は使用する必要があります:

List.Empty: List[Int]

しかしもちろん、他の理由もあります。そのような:

defはJVMレベルのメソッドです

コードを使用する場合:

trades filter isEuropean

isEuropean次のいずれかの宣言を選択できます。

val isEuropean = (_ : Trade).country.region = Europe

または

def isEuropean(t: Trade) = t.country.region = Europe

後者は、宣言の時点ではオブジェクト(関数インスタンス用)の作成を回避しますが、使用の時点では回避しません。Scalaは、使用時にメソッド宣言用の関数インスタンスを作成しています。_構文を使用した方が明確です。

ただし、次のコードでは次のようになります。

val b = isEuropean(t)

...isEuropean宣言されている場合def、そのようなオブジェクトは作成されていないため、コードのパフォーマンスが向上する可能性があります(最後のナノ秒ごとに重要な価値がある非常にタイトなループで使用される場合)

于 2012-06-05T16:40:27.507 に答える