函數(shù)的定義
函數(shù)VS方法
- 方法可以認為是函數(shù)的一種特殊類型
- 從形式上看,有 receiver 的函數(shù)即為方法
函數(shù)的類型
- 第一個例子
fun foo() {}//的函數(shù)類型是:() -> Unit
- 第二個例子
fun foo(p0: Int): String {
return ""
}//的函數(shù)類型是:(Int) -> String
- 第三個例子
class Foo {
fun bar(p0: String, p1: Long): Any {
return 0
}
}
的函數(shù)類型是:
Foo.(String, Long) -> Any//第一種寫法
(Foo, String, Long) -> Any//第二種寫法
前兩個例子比較簡單苏潜,第三個例子中的Foo就是上面提到的函數(shù)和方法區(qū)別中的receiver了银萍。其實receiver就是這種類函數(shù)中隱藏的第一個參數(shù),在Java的方法中我們可以使用this關鍵字訪問類中的成員其實也是因為this是通過方法的第一個參數(shù)被傳入進來的恤左。比較有意思的是在python中receiver是直接顯示的:
class Foo:
def bar(self,p0,p1):
pass
函數(shù)的引用
- 函數(shù)的引用類似C語言中的函數(shù)指針贴唇,可用于函數(shù)傳遞
fun foo() {}//的函數(shù)引用表示為 ::foo
class Foo {
fun bar(p0: String, p1: Long): Any {
return 0
}
}//的函數(shù)引用表示為 Foo::bar
既然是函數(shù)引用,那么就可以通過變量去接收
val r1: () -> Unit = ::foo
val r2: (Foo, String, Long) -> Any = Foo::bar
這里有一點需要注意的是飞袋,如果當我們通過類的實例去表示函數(shù)引用的時候戳气,那么函數(shù)類型中就不再包含receiver了:
val foo = Foo()
val r3: (String, Long) -> Any = foo::bar