数学者はそうではなく、「我々はパッシング機能f
を呼び出すことx
パラメータとして」と言って、自分の少し面白い方法を持って、私たちのプログラマーが言うように、彼らは「その引数x
に機能f
を適用する」について話します。
数学とコンピュータサイエンスでは、適用は引数に 関数を適用する関数です。
Wikipedia
apply
オブジェクト指向とScalaで機能的パラダイムとの間のギャップを閉じる目的を果たします。 Scalaの各関数はオブジェクトとして表現できます。すべての関数にはOO型もあります。たとえば、Int
パラメータをとり、Int
を返す関数のOOタイプはFunction1[Int,Int]
です。
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
すべてが今Function1[Int,Int]
オブジェクトへの参照として扱うことができるスカラf
内のオブジェクトであるため。
f.toString
それとも我々はf
にcompose
メソッドを呼び出すことによって、別のFunction1[Int,Int]
オブジェクトを定義することができます。たとえば、私たちは関数がメソッドを持っていないので、純粋な機能のためには不可能だっただろうAny
から継承されたtoString
メソッドを呼び出すことができます私たちが実際に機能を実行したい場合は今
val f2 = f.compose((x:Int) => x - 1)
を、または私たちはにapply
メソッドを呼び出すと数学者としての言う「その引数に関数を適用」:2つの異なる機能を一緒に連鎖しますオブジェクト:
f2.apply(2)
書き込みf.apply(args)
あなたがオブジェクトとして表現関数を実行するたびに、オブジェクト指向の方法ですが、多くの付加的な情報を追加することなく、コードに混乱の多くを追加し、それは次のようになりますf(args)
など、より標準的な表記を使用できるようになりました。これはScalaコンパイラが関数オブジェクトに参照f
を持っているときに実行され、f (args)
と書くと、コンパイラは暗黙的にf (args)
をオブジェクトメソッド呼び出しf.apply (args)
に展開します。
Scalaのすべての関数はオブジェクトとして扱うことができ、それ以外の方法でも動作します。すべてのオブジェクトは、apply
メソッドを持っている限り、関数として扱うことができます。このようなオブジェクトは関数表記で使用できます。
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
オブジェクトを関数として扱いたい場合は、多くの使用例があります。最も一般的なシナリオはfactory patternです。代わりに、関連するクラスの新しいインスタンスを作成する引数のセットに、我々はapply
オブジェクトをすることができますファクトリメソッドを使用してコードに混乱を追加する:
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
のでapply
方法は間のギャップを埋めるだけの手軽な方法です。 Scalaの関数とオブジェクトを示します。ここ
すばやいグーグルでも素敵な記事。ここに1つあります:http://jackcoughonsoftware.blogspot.com/2009/01/deeper-look-at-apply-method-in-scala.html –
http://stackoverflow.com/questions/1223834/how-does- scalas-apply-method-magic-work – ses
実際にJava/C++のコンストラクタと同じですが、値を返すことができ、 'apply'という名前を持っています – ses