[解決済み] Scalaのapply関数とは何ですか?
質問
工夫されたアンマーシャリングや動名詞から理解できなかった( アン
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の関数とオブジェクトの間のギャップを埋める便利な方法に過ぎません。
関連
-
[解決済み】Spark Exponential Moving Averageについて
-
[解決済み] データフレームを複数回グループ化する
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] Scalaでファイル全体を読む?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み】Scalaの「リフティング」とは何ですか?
-
[解決済み】コマンドラインパラメータを解析する最良の方法?[クローズド]
-
[解決済み】Scalaのコンテキストとビューバウンドとは何ですか?
-
[解決済み】Scalaの名前による呼び出しと値による呼び出し、明確化の必要性
-
[解決済み] sbtのScalaTest:タグなしで単一のテストを実行する方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Spark Exponential Moving Averageについて
-
[解決済み] スパークSPLラウンド&ブラウンド
-
[解決済み] GSON JsonObject "Unsupported Operation Exception: null" getAsString
-
[解決済み] Spark - Sparkでパーセンタイルを計算する方法は?
-
[解決済み] sbtのlibraryDependenciesで言うところの++=と+=の違いは何ですか?
-
[解決済み] Scalaの''って何?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み】Scalaにおける中括弧と括弧の正式な違い、また、どのような場合に使用すべきなのか?
-
[解決済み】関数を定義する "def "と "val "の違いとは?
-
[解決済み】Scala 2.8における<:<、<%<、=:=の意味と、それらのドキュメントはどこにあるのか?