수색…
통사론
- 재미 이름 ( Params ) = ...
- 재미 이름 ( Params ) {...}
- 재미 이름 ( Params ) : 유형 {...}
- 재미 < 유형 인수 > 이름 ( Params ) : 유형 {...}
- 인라인 재미 이름 ( Params ) : 유형 {...}
- { ArgName : ArgType -> ...}
- { ArgName -> ...}
- { ArgName -> ...}
- {( ArgName : ArgType ) : 유형 -> ...}
매개 변수
매개 변수 | 세부 |
---|---|
이름 | 함수 이름 |
Params | 이름과 유형을 가진 함수에 주어진 값 : Name : Type |
유형 | 함수의 반환 형식 |
유형 인수 | 일반 프로그래밍에 사용되는 매개 변수 유형 (반드시 반환 유형이 아님) |
ArgName | 함수에 주어진 값의 이름 |
ArgType | ArgName에 대한 유형 지정자 |
ArgName | 쉼표로 구분 된 ArgName 목록 |
기타 기능 가져 오기
"Lambda Functions"에서 볼 수 있듯이 함수는 다른 함수를 매개 변수로 사용할 수 있습니다. 다른 함수를 사용하는 함수를 선언하는 데 필요한 "함수 유형"은 다음과 같습니다.
# Takes no parameters and returns anything
() -> Any?
# Takes a string and an integer and returns ReturnType
(arg1: String, arg2: Int) -> ReturnType
예를 들어, vaguest 유형 () -> Any?
, 람다 함수를 두 번 실행하는 함수를 선언한다.
fun twice(x: () -> Any?) {
x(); x();
}
fun main() {
twice {
println("Foo")
} # => Foo
# => Foo
}
람다 함수
람다 함수는 일반적으로 함수 매개 변수로 작동하는 함수 호출 중에 생성되는 익명 함수입니다. 인수가 필요한 경우, 이러한 화살표 전에 넣어 - 그들은 {중괄호}로 표현을 둘러싼에 의해 선언 ->
.
{ name: String ->
"Your name is $name" //This is returned
}
람다 함수의 마지막 문장은 자동으로 반환 값입니다.
타입은 컴파일러가 타입을 추론 할 수있는 장소에 람다를 놓는 경우 선택 사항입니다.
여러 인수 :
{ argumentOne:String, argumentTwo:String ->
"$argumentOne - $argumentTwo"
}
람다 함수가 오직 하나의 인자만을 필요로한다면, 인자리스트는 생략 될 수 있고 대신 하나의 인자가 it
사용하여 참조 될 수있다.
{ "Your name is $it" }
함수에 대한 유일한 인수가 람다 함수이면 함수 호출에서 괄호를 완전히 생략 할 수 있습니다.
# These are identical
listOf(1, 2, 3, 4).map { it + 2 }
listOf(1, 2, 3, 4).map({ it + 2 })
함수 참조
함수의 이름 앞에 ::
붙임으로써 실제로 함수를 호출하지 않고 함수를 참조 할 수 있습니다. 그런 다음 다른 함수를 매개 변수로 받아들이는 함수로 전달할 수 있습니다.
fun addTwo(x: Int) = x + 2
listOf(1, 2, 3, 4).map(::addTwo) # => [3, 4, 5, 6]
수신자가없는 함수는 (ParamTypeA, ParamTypeB, ...) -> ReturnType
으로 변환됩니다. 여기서 ParamTypeA
, ParamTypeB
...는 함수 매개 변수의 유형이고`ReturnType1은 함수 반환 값의 유형입니다.
fun foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
//...
}
println(::foo::class.java.genericInterfaces[0])
// kotlin.jvm.functions.Function3<Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo0, Foo1, Foo2) -> Bar
리시버 (확장 기능이든 멤버 함수이든)를 사용하는 함수의 구문은 다릅니다. 이중 콜론 앞에 수신기의 유형 이름을 추가해야합니다.
class Foo
fun Foo.foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
//...
}
val ref = Foo::foo
println(ref::class.java.genericInterfaces[0])
// kotlin.jvm.functions.Function4<Foo, Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo, Foo0, Foo1, Foo2) -> Bar
// takes 4 parameters, with receiver as first and actual parameters following, in their order
// this function can't be called like an extension function, though
val ref = Foo::foo
Foo().ref(Foo0(), Foo1(), Foo2()) // compile error
class Bar {
fun bar()
}
print(Bar::bar) // works on member functions, too.
그러나 함수의 수신자가 오브젝트 인 경우 수신자는 매개 변수 목록에서 생략됩니다. 이는 이러한 유형의 하나의 인스턴스이기 때문입니다.
object Foo
fun Foo.foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
//...
}
val ref = Foo::foo
println(ref::class.java.genericInterfaces[0])
// kotlin.jvm.functions.Function3<Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo0, Foo1, Foo2) -> Bar
// takes 3 parameters, receiver not needed
object Bar {
fun bar()
}
print(Bar::bar) // works on member functions, too.
kotlin 1.1 이후로 함수 참조는 변수에 바인드 될 수 있으며, 이는 바운드 함수 참조 라고합니다.
fun makeList(last: String?): List<String> {
val list = mutableListOf("a", "b", "c")
last?.let(list::add)
return list
}
이 예제는 한정 함수 참조가 작동하는 방법을 보여주기 위해서만 제공됩니다. 다른 모든 감각에서는 나쁜 습관입니다.
그래도 특별한 경우가 있습니다. 멤버로 선언 된 확장 함수는 참조 할 수 없습니다.
class Foo
class Bar {
fun Foo.foo() {}
val ref = Foo::foo // compile error
}
기본 기능
함수는 fun
키워드와 함수 이름 및 매개 변수를 사용하여 선언됩니다. 함수의 반환 유형을 지정할 수도 있습니다. 기본값은 Unit
입니다. 함수 본문은 중괄호 {}
묶습니다. 반환 유형이 Unit
이 아닌 경우 본문은 본문의 모든 종료 분기에 대해 return 문을 실행해야합니다.
fun sayMyName(name: String): String {
return "Your name is $name"
}
동일한 약식 버전 :
fun sayMyName(name: String): String = "Your name is $name"
그리고 유추 할 수 있기 때문에 유형을 생략 할 수 있습니다.
fun sayMyName(name: String) = "Your name is $name"
속기 기능
함수가 하나의 식만 포함하면 중괄호를 생략하고 대신 변수 할당과 같은 equals를 사용할 수 있습니다. 표현식의 결과는 자동으로 리턴됩니다.
fun sayMyName(name: String): String = "Your name is $name"
인라인 함수
함수는 inline
접두사를 사용하여 inline
으로 선언 할 수 있습니다.이 경우 함수는 호출되는 대신 C로 매크로처럼 동작합니다. 컴파일시 함수의 본문 코드로 대체됩니다. 이것은 일부 환경에서 성능상의 이점을 가져올 수 있으며 주로 lambda가 함수 매개 변수로 사용됩니다.
inline fun sayMyName(name: String) = "Your name is $name"
C 매크로의 한 가지 차이점은 인라인 함수가 호출되는 범위에 액세스 할 수 없다는 점입니다.
inline fun sayMyName() = "Your name is $name"
fun main() {
val name = "Foo"
sayMyName() # => Unresolved reference: name
}
연산자 함수
Kotlin은 fixed symbolic representation ( +
또는 *
와 같은)과 고정 된 우선 순위를 가진 미리 정의 된 연산자 집합에 대한 구현을 제공 할 수있게 해줍니다. 연산자를 구현하기 위해 해당 유형에 대해 고정 된 이름의 멤버 함수 또는 확장 함수를 제공합니다. 과부하 연산자가 operator
수정 자로 표시되어야하는 함수 :
data class IntListWrapper (val wrapped: List<Int>) {
operator fun get(position: Int): Int = wrapped[position]
}
val a = IntListWrapper(listOf(1, 2, 3))
a[1] // == 2
더 많은 연산자 함수는 여기 에서 찾을 수 있습니다 .