Scalaの関数とメソッドの違い

1.さまざまな定義

1.1defを使用したメソッド

def methodName1 p1:Int、p2:Int :Int = {

val c = a + b

cを返す

}

1.2関数使用変数

var funcName1 =(p1:Int、p2:Int)=> p1 + p2

 

2.メソッド名は、「呼び出し」メソッド自体です。

関数名 ``''関数自体を表します

 

3.パラメータリスト()は省略できません

3.1メソッドのパラメータリストは省略できます

def methodName2 :Int={
  var c = 3
  print("this is 3")
return c
}

 

3.2機能パラメータ一覧は省略できません

var funcName2 =()=> print( "test")

パラメータがない場合でも括弧を入れてください

 

4.戻り値のタイプを指定できますか

メソッドを指定できます

機能を指定できません

 

詳細:

ScalaのメソッドはJavaのメソッドと同じであり、メソッドは作成クラスの一部です。メソッドには、名前、型シグネチャ、場合によってはメソッドの注釈、およびメソッドの関数実装コード(バイトコード)があります。

Scalaの関数は完全なオブジェクトです。Scalaは22の特性を使用して、関数の概念を抽象化します。これらの22の特性は、Function1からFunction22までです。

上の図に示すように、Function10は次のことを表します。10個の仮パラメーターとR(共変)の戻り値を持つ関数。

Scalaの関数は、実際にはこれらの特性を継承するクラスのオブジェクトです。たとえば、関数リテラルを使用して関数を定義します。

実際、上記の関数の定義は次の定義と同等です。

Function2は特性であるため、直接新しいものにすることはできません。上記の新しいFunction2 [Int、Int、Int](){}は、Function2の機能を実装するクラスのオブジェクトを実際に定義してインスタンス化します。

applyはscalaのシンタックスシュガーです。オブジェクトobjでobj()を呼び出すと、scalaコンパイラはそれをobj.apply()に変換します。クラスclazzでclazz()を呼び出すと、scalaコンパイラはそれをclazz_company_objに変換します。 .apply()、ここでclazz_company_objはclazzのコンパニオンオブジェクトです。

 

具体的な違いは次のように要約できます。

1.メソッドは(空のパラメーターを持つメソッドを除いて)個別の式として存在することはできませんが、関数は存在できます。といった:

上記の例では、最初にメソッドmを定義し、次に関数fを定義します。次に、f自体が次のようになるため、関数名(関数値)を最終式として使用します。

オブジェクト(FunctionNトレイトを実装するオブジェクト)なので、この使用方法は完全に正しいです。ただし、メソッド名を最終式として使用すると、エラーが発生します。

2.関数にはパラメーターリストが必要であり、メソッドにはパラメーターリストを含めることはできません。

上記の例では、m1メソッドはゼロパラメータを受け入れるため、パラメータリストは省略できます。また、関数はパラメータリストを省略できません

3.メソッド名はメソッド呼び出しであり、関数名は関数オブジェクト自体のみを表します。

これは理解しやすいです。関数リテラル(関数名または関数値とも呼ばれます)を保持する変数は、それ自体がFunctionN特性を実装するクラスのオブジェクトであるため、オブジェクトのapplyメソッドを呼び出すには、obj()構文を使用する必要があります。 。したがって、関数を呼び出すには、関数名の後に括弧を追加します。次のように:

4.関数が必要な場合、メソッドが渡されると、ETA拡張が自動的に実行されます(メソッドを関数に変換します)

メソッドを変数に直接割り当てると、エラーが報告されます。変数の型が関数であると指定すると、次のようにコンパイルできます。

もちろん、メソッドを強制的に関数に変換することもできます。これは、scalaでいくつかのアプリケーション関数を使用します。

5.名前によるパラメータは本質的にメソッドです

名前によるパラメーターは、基本的に、次のように、空のパラメーターリストを持つメソッドです。

上記のコードは実際にはメソッドm1を定義しており、m1のパラメーターは名前(メソッド)によるパラメーターです。パラメータが空のメソッドの場合、メソッド名はメソッド呼び出しであるため、List(x、x)は実際には2つのメソッド呼び出しを行います。

List(x、x)が2つのメソッド呼び出しを行ったため、2つの異なる値が取得されます。

関数のm1の定義を少し変更し、最初にxをキャッシュすると、結果は以前とは大きく異なります。

おすすめ

転載: blog.csdn.net/hzp666/article/details/114658510