menu
書いてる野郎
orebike@gmail.com
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))
このように、位置と呼び出しタイミングは関係ないみたいだ。
通常引数無しの関数はこのように宣言して、括弧なしで使える。当然有りでも使える
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
関数リテラルではデフォルト引数は設定できない