Scalaにおける関数とメソッドの基本

Scalaについてより詳しく学びたいですか?DataCampのScalaの入門コースを受けてみてください。

Scalaは、関数型プログラミング言語であり、それには最初のクラスの値として関数とメソッドが含まれています。これらには似ている点と似ていない点があります。関数とメソッドは、再利用可能なコードのブロックであり、繰り返されるコードを1つの場所に存储することができ、特定の特定のタスクを実行するために関数を呼び出すことができます。また、これらはコードをより簡単にデバッグしたり修正したりすることもできます。

しかし、関数は初期化される変数のオブジェクトですが、メソッドは「def」キーワードに続けてメソッド名、パラメーターリスト、メソッド本体と返り値を含む形式で始まります。

メソッド宣言と定義

Scalaでのメソッド宣言と定義のスyntaxは以下の通りです。

def 'method_name' ('parameters':'return_type_parameters') : ('return_type_of_method') = { 'method_body' return 'value' }

Scalaのメソッドは以下の部分で始まります。

  1. ‘def’:メソッドを宣言するためのキーワードです。
  2. ‘method_name’:メソッドの名前であり、小文字の驼峰命名法になっています。
  3. ‘parameters’:メソッドのパラメーターです。0つまたは1つのパラメーターしかない場合、複数のパラメーターがある場合はコンマで区切られます。
  4. ‘return_type_of_parameters’:「parameters_list」のデータ型に合致する必要があり、必須です。
  5. ‘return_type_of_method’:オプションですが、デフォルトでは’Unit’が返されますが、’return’キーワードを使用することで値を返すことができます。
  6. 代入記号(‘=’):オプションであり、使用すると戻り値を代入し、使用しないとメソッドが何も返さなくなります。
  7. ‘method_body’:波括弧'{}’で囲まれたコードブロックであり、必要なロジックまたは特定のタスクや操作を含みます。
  8. return:必要な値を返すために使用されるキーワードであり、プログラムを終了させますが、Scalaではあまり使用されません。

メソッド呼び出し

Scalaでのメソッド呼び出しの構文は以下の通りです。

method_name(arguments)

メソッド呼び出しは’method_name’で簡単に行えます。これは呼び出したい対応するメソッドの名前であり、引数が渡されます。

名前付き引数を持つメソッド

名前付き引数を持つメソッドは、メソッド呼び出し時にメソッドのパラメータに引数を渡すことを許可します。各引数がメソッドパラメータに1対1でマッチングされます。以下には、関数宣言と定義に引数を渡し、メソッド呼び出しの動作を示す例を見ます。

object calculateResult { def funSub(x:Int, y:Int) : Int = { var diff:Int = 0 diff = x - y // return value return diff } def main(args: Array[String]) { // Function call println("Difference of the value is: " + funSub(8,6)); println("Difference of the value is " + funSub(y=6,x=8)); } }

上記のプログラムは以下の出力を与えます。
値の差は: 2
値の差は: 2

上のプログラムは、「calculateResult」というオブジェクトを含んでいます。そして、その内部には「funSub」という名前のメソッドが含まれており、このメソッドには「x」と「y」の両方がInt型の戻り値を持つパラメーターがあり、このメソッドの総合的な戻り値は「Int」型です。それに続くのは、戻り値の割り当て语句です。花括弧はメソッド本体を示しており、変数「diff」は初期値0で初期化されます。mainメソッドで行われた「funSub(8,6)」というメソッドコールは、8を「x」に、6を「y」に割り当て、差分演算を行い、「diff」の値が返され、最終的に印刷されます。同様に、「funSub(x=8,y=6)」は、メソッドコールの間で、6を「y」に、8を「x」に割り当てることができ、引数を渡さずに空でもよいことができ、順序は重要ではありません。同様の操作が行われ、返り値があり、結果が印刷されます。

デフォルトパラメーター値

メソッドパラメーターにデフォルト値を指定することができ、引数を渡さないことでメソッドコールを空にすることができます。

object calculateResult { def funSub(x:Int=9, y:Int=6) : Int = { var diff:Int = 0 diff = x - y // return value return diff } def main(args: Array[String]) { // Function call print( "The final value is: " + funSub() ); } }

上のプログラムは、以下のような出力を提供します。
最終的な値は: 3

上記のプログラムは、「calculateResult」というオブジェクトを定義し、その内部には「funSub」というメソッドがあり、それにはxとyという2つの引数があり、どちらも「Int」型の返り値を持ち、これらのメソッドの全体の返り値は「Int」型である。それに続き、返り値を割り当てる宣言语句があり、花括号はメソッド本体を示しており、変数「diff」が初期値0で初期化される。メソッド呼び出しは、主要なメソッド内部で行われ、「funSub()」を呼び出し、xを9、yを6と初期化し、操作が行われ、これにより「diff」の値が返され、印刷される。

可変長引数

可変長引数は、任意の変数の引数を取る引数であり、使用者やクライアントから渡されることができる。メソッドの最後の引数は「*」を使用して宣言され、繰り返される必要があることを示している。

object variableArgument { def main(args: Array[String]) { printAll("Scala", "is", "great") } def printAll(strings: String*) { var i : Int = 0; for( value <- strings ){ println(value); i = i + 1; } } }

上記のプログラムは、以下のような出力を生成します。
Scala
is
great

上記のプログラムは、「variableArgument」というオブジェクトを持つ「printAll」メソッドを持っており、最後に可変長引数「String*」を定義しています。メソッド呼び出し時に、文字列のリストが渡されることができます。渡された文字列のリストを루ープして、主要な関数の内部で出力として表示します。

再帰関数

再帰は、関数型プログラミングで使われる技術で、問題は元の問題と類似したより小さな部分問題に反復的に分割され、解決されます。より小さな問題が解決され、その解を元の問題の解決に適用することで、元の問題の解を得ます。したがって、それは分割統治または減少統治問題と呼ばれ、コードをきれいで洗練されたものにします。再帰関数を書く際には、2つの点を厳密に考慮する必要があります。

  • 基本ケース: 関数には、1つ以上の基本ケースが必要であることがあり、それ以外の場合は無限再帰につながる可能性があります。それには解決策が必要で、つまり、再帰を使わずに得られる単純な出力または解決策の形式です。
  • 再帰ケース: 再帰関数が適用されるケースであり、再帰的な呼び出しが行われます。問題の核心は、各再帰呼び出しでサイズが減少することであり、問題がより小さい部分問題に分割される必要があることです。これを続けると基本ケースに達します。最後に、解を組み合わせて主要な問題を解決し、それが分割統治アプローチと呼ばれます。

任意の与えられた数の階乗はn!であり、数学的に以下のように表されます:

n! = n.(n-1).(n-2)…3.2.1

また、項を(n-1).(n-2)…3.2.1にして(n-1)!とできます。したがって、任意の与えられた数の階乗は常にn. (n-1)!です。

以下に、問題を解く再帰的な方法を見ることができます。

object factorialDemo { def main(args: Array[String]) { for (i <- 1 to 5) println( "Factorial of " + i + ": = " + factorial(i) ) } def factorial(n: Int): Int = { if (n <= 1) return 1 else return n * factorial(n - 1) } }

上記のプログラムの出力は以下の通りです:
1の階乗: = 1
2の階乗: = 2
3の階乗: = 6
4の階乗: = 24
5の階乗: = 120

上記のように、’factorialDemo’というオブジェクトがあり、その中に5回繰り返されるループを含む’main’関数があり、再帰関数を使用して’n’を5回まで再帰呼び出しする’factorial’関数の呼び出しが含まれています。nが1以下になると基本ケースで停止し、結果が返されて印刷されます。

匿名関数

匿名関数は名前を持たない軽量の関数定義であり、Scalaでは関数リテラルとして知られています。

匿名関数の構文と例は以下の通りです:

  • 匿名関数の最初の構文と例は次の通りです:

構文:

('first_variable':'data_type', 'second_variable':'data_type') => "certain_expression"

例:

(var1:String:var2:String) => var1 + var2

または

  • 匿名関数の2つ目の構文と例は次の通りです:

構文:

(_:'data_type')operator(_'data_type')

例:

(_:String)+(_:String)

最初の構文は、「=>」の後の式が特定の値に評価され、「=>」の前の変数のリストが式の評価に使用されることを示しています。

上記の2つ目の構文は、値を「ワイルドカード」文字として一度だけ受け入れ、その後オペレータがそれらの間で操作されるプレースホルダとして機能します。

以下は匿名関数の例を示しています。

object anonymousDemo { def main(args: Array[String]) { var function1 = (var1:Int, var2:Int) => var1 + var2 var function2 = (_:Int) + (_:Int) // function call println(function1(5, 5)) println(function2(7, 3)) } }
Initializing Scala interpreter ... Spark Web UI available at http://DESKTOP-03TH7J0:4040 SparkContext available as 'sc' (version = 2.4.3, master = local[*], app id = local-1566986265958) SparkSession available as 'spark' <console>:10: error: unbound placeholder parameter var function2 = {_:Int} + {_:Int} ^ <console>:10: error: unbound placeholder parameter var function2 = {_:Int} + {_:Int} ^

上記のプログラムは以下の出力を生成します。
10
10

上記は「anonymousDemo」と名付けられたオブジェクトに含まれる「main」関数に含まれる2つの匿名関数を見ることができます。彼らは構文的に異なりますが、同じ結果を生成することができます。「function1」は関数呼び出しから引数を受け取り、呼び出されている際に値を渡します。これは5と5を渡して、出力が10と表示されます。また「function2」は7と3を渡して呼び出され、一度に値を受け取ります。これは有効な「Integer」を受け取ることができます。あなたの場合は加算操作を行い、結果を出力してください。

結論

このチュートリアルを読んだおめでとうございます。

Scalaには高阶関数、嵌套関数、カリング関数などの多くの高度なトピックがあります。

参照:
Scalaの基本ツアー
Scala | 関数 – 基本
Scala – 関数
Scalaの匿名関数

DataCampのScalaの入门コースを参照してください。

Source:
https://www.datacamp.com/tutorial/basic-functions-methods-scala