Scala/関数/関数を宣言する

Scala/関数/関数を宣言する

基本

def キーワードに続き、関数名、パラメータ、戻り値の型 でイコール括弧で処理を中に書く。 ブロック内で最後に評価された値が戻り値となる。

def myadd(a:Int, b:Int):Int = {
  a + b
}
println(myadd(1, 2))

これは結構どこでも作ることができて別に普通に関数の中で関数を作ることもできる。 しかし関数は作られるのではなく、宣言されるようで

println(myadd(1, 2))
def myadd(a:Int, b:Int):Int = {
  a + b
}
println(myadd(1, 2))

このように、位置と呼び出しタイミングは関係ないみたいだ。

1ステップ関数のブロック省略

このような1ステップの短い関数はブロックの中括弧を省略して1行で書くことができる

def hoge = {
  1 + 1
}
// 1行で書ける
def hoge = 1 + 1

括弧付き呼び出しを強制する

通常引数無しの関数はこのように宣言して、括弧なしで使える。当然有りでも使える

def hoge = 1 + 1
var piyo = hoge
var fuga = hoge()

しかし、Scala のコーディング規約で「副作用を伴う関数は括弧付きで呼び出す」というものがある。 ここで引数は無いが副作用が伴う関数を作る場合にそれを強制する書き方ができる。

関数の宣言に括弧をつけて宣言すると、その関数を実行する際に括弧の使用が強制される

def hoge() = 1 + 1
var piyo = hoge  //これはできない
var fuga = hoge() //これはできる

関数を返す関数

Scala は関数型言語なので関数返す関数というものを定義できる

def getMyadd():(Int, Int) => Int = {
  (a:Int, b:Int) => {
    a + b
  }
}
val myadd = getMyadd()
println(myadd(1, 3))

のように書く。

関数名、引数の型に続きコロン、それに続きリターンする関数の引数、矢印でリターンする関数のリターンする型、イコールに続き関数本体と記述する。

引数に関数を取る関数

パラメータ指定するが、その型はパラメータに取る関数のシグネチャを書く

val myadd = (a:Int, b:Int) => {
  a + b
}
def mycalc(a:Int, b:Int, mymethod:(Int, Int) => Int):Int = {
  mymethod(a, b)
}
println(mycalc(1, 2, myadd))

引数のデフォルト値

デフォルトの引数が取れる

def myadd(a:Int = 0, b:Int = 0):Int = {
  a + b
}
println(myadd())    // => 0
println(myadd(11))  // => 11

関数リテラルではデフォルト引数は設定できない

scala/basic/function/create.txt · 最終更新: 2020-08-03 13:16 by ore