ラムダ式
インラインでメソッド宣言したい
キーワード
式形式のメンバー
=>で{}を省略出来るよ。という話。
1行で済むなら綺麗に書けるね。
参考
C#の方式も使えるが、Unity独自デリゲートがまた別にある C#のEventHandlerに比べると、まだ枯れた文法をしてる
code:ruby
bar = -> ( a, b ) { a * b }
bar( 2, 3 ) # => 6
# 他所の言語で使われる => は、rubyではハッシュのセパレータに使う
hoge = {
fuga => :piyo
}
ブロックとラムダ式は微妙に違う概念なので注意
code:javascript
var bar = function(a, b){ a * b } // これは無名関数
bar(2, 3); // => 6
foo = a => a + 1; // これがラムダ式(色々省略した書き方)
a(1); // => 2
arguments:無名関数では参照できる。 ラムダ式では参照できない。
クロージャと呼んでいる
code:型宣言
extensiton Array {
func any(callback: (Element) -> Bool) -> Bool { // (Element) -> Bool の部分
// hoge
}
}
code:格納
array.any(callback: { (element: String) -> Bool in
return element.isEmpty
})
引数をクロージャに引き渡す場合は、その引数に@excapingアノテーションを付ける
code:引数の中継
func hoge(params: @escaping String) {
fuga(callback: {() -> Void in
print("\(params)")
}
}
code:高階関数
fun hoge(fuga:Int, callback: () -> Unit) { // 値を返さない場合VoidではなくUnit
callback()
}
hoge(10, { /* do Something */ })
hoge(10) { /* do Something */ } // 最後の引数が関数なら、引数を並べる( )括弧の外に出すのがKotlinの慣習。
names.any({ name: String -> return@any name.isEmpty() }) //何も省略しない場合。どこのreturnなのか、ラベル(@any)をつける
names.any({ name: String -> name.isEmpty() }) //returnは省略可能
names.any({ name -> name.isEmpty() }) //型も省略可能
names.any({ it.isEmpty() }) //引数が一つの場合は、itがデフォルトになる
code:ラムダ式
val sum: (Int, Int) -> Int = { x, y -> x + y }
code:クロージャ
var sum = 0
ints.filter { it > 0 }.forEach {
sum += it // このラムダ式はブロックの外側にあるsumにアクセスして、しかも変更している
}
print(sum)
code:thisの扱い
class Hoge {
fun hogehoge()
fun fuga(callback:()->Void){ /* 中略 */ }
fun piyo() {
fuga() {
this.hogehoge() // NG
this@Hoge.hogehoge() // OK thisの向き先をラベルで明記する必要がある
}
}
}
ClassクラスとかMethodクラスとかある
関数ポインタとの大きな違いは、クロージャが使えるかどうか、らしい。(?)