1. ホーム
  2. scala

[解決済み] Scalaのapply関数とは何ですか?

2022-03-17 11:25:45

質問

工夫されたアンマーシャリングや動名詞から理解できなかった( アン AddTwo クラスには apply を2つ追加している!)例です。

構文糖ということなので、(文脈から推察して)あるコードをより直感的に理解できるように設計されたのだろうと理解しています。

を持つクラスは、どのような意味を持つのでしょうか? apply 関数が与えるものなのか?また、どのような目的で使用され、コードをより良くするのでしょうか(アンマーシャル、名詞の動詞化など)?

コンパニオン・オブジェクトで使用した場合、どのように役立つのでしょうか?

どのように解決するのですか?

数学者は自分たち独自のちょっとおかしな方法を持っているので、「"」と言う代わりに、関数 f を渡すと x をパラメータとして使用し、プログラマーが言うように「関数を適用する」ことを話しています。 f をその引数 x となります。

数学とコンピュータサイエンスでは、Applyは、適用する関数です。 関数を引数に渡すことができます。
ウィキペディア

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

Scala ではすべてがオブジェクトなので f への参照として扱えるようになりました。 Function1[Int,Int] オブジェクトを作成します。例えば toString メソッドから継承した Any 関数にはメソッドがないので、純粋な関数では不可能だったでしょう。

  f.toString

あるいは、別の Function1[Int,Int] オブジェクトを呼び出すことで compose メソッドで f と、2つの異なる機能を連鎖させることができます。

 val f2 = f.compose((x:Int) => x - 1)

さて、実際に関数を実行したい場合、あるいは数学者が言うように "関数をその引数に適用する場合" は、次のように呼びます。 apply メソッドを Function1[Int,Int] オブジェクトを作成します。

 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 

オブジェクトを関数として扱いたいケースはたくさんあります。最も一般的なシナリオは ファクトリーパターン . ファクトリーメソッドを使用してコードに乱雑さを加える代わりに、次のようにすることができます。 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の関数とオブジェクトの間のギャップを埋める便利な方法に過ぎません。