Kotlin : 함수를 매개 변수로 다른 함수에 전달하는 방법은 무엇입니까?
주어진 함수 foo :
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
우리는 할 수 있습니다 :
foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }
이제 다음과 같은 기능이 있다고 가정 해 보겠습니다.
fun buz(m: String) {
println("another message: $m")
}
"buz"를 매개 변수로 "foo"에 전달할 수있는 방법이 있습니까? 다음과 같은 것 :
foo("a message", buz)
::
함수 참조를 나타내는 데 사용 하고 다음을 수행합니다.
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
// my function to pass into the other
fun buz(m: String) {
println("another message: $m")
}
// someone passing buz into foo
fun something() {
foo("hi", ::buz)
}
Kotlin 1.1 이후로 함수 참조 연산자 앞에 인스턴스를 붙여서 클래스 멤버 인 함수 ( ' Bound Callable References ')를 사용할 수 있습니다 .
foo("hi", OtherClass()::buz)
foo("hi", thatOtherThing::buz)
foo("hi", this::buz)
매개 변수로서의 멤버 함수 정보 :
- Kotlin 클래스는 정적 멤버 함수를 지원하지 않으므로 멤버 함수를 다음과 같이 호출 할 수 없습니다. Operator :: add (5, 4)
- 따라서 멤버 함수는 First-class 함수와 동일하게 사용할 수 없습니다.
- 유용한 접근 방식은 함수를 람다로 래핑하는 것입니다. 우아하지는 않지만 적어도 작동합니다.
암호:
class Operator {
fun add(a: Int, b: Int) = a + b
fun inc(a: Int) = a + 1
}
fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)
fun main(args: Array<String>) {
calc(1, 2, { a, b -> Operator().add(a, b) })
calc(1, { Operator().inc(it) })
}
Kotlin 1.1
사용 ::
기준 방법.
처럼
foo(::buz) // calling buz here
fun buz() {
println("i am called")
}
메소드 이름 앞에 "::"를 사용하십시오.
fun foo(function: () -> (Unit)) {
function()
}
fun bar() {
println("Hello World")
}
foo(::bar)
출력 :Hello World
분명히 이것은 아직 지원되지 않습니다.
더 많은 정보:
http://devnet.jetbrains.com/message/5485180#5485180
http://youtrack.jetbrains.com/issue/KT-1183
setter 및 getter 메서드 를 전달하려는 경우 .
private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) {
val oldValue = getValue()
val newValue = oldValue * 2
setValue(newValue)
}
용법:
private var width: Int = 1
setData({ width = it }, { width })
Jason Minard의 대답은 좋은 것입니다. 이것은 또한 lambda
.
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
val buz = { m: String ->
println("another message: $m")
}
로 호출 할 수 있습니다 foo("a message", buz)
.
를 사용하여 좀 더 건조하게 만들 수도 있습니다 typealias
.
typealias qux = (m: String) -> Unit
fun foo(m: String, bar: qux) {
bar(m)
}
val buz: qux = { m ->
println("another message: $m")
}
First-class functions are currently not supported in Kotlin. There's been debate about whether this would be a good feature to add. I personally think they should.
참고URL : https://stackoverflow.com/questions/16120697/kotlin-how-to-pass-a-function-as-parameter-to-another
'programing' 카테고리의 다른 글
데이터베이스 레코드의 물리적 대 논리적 / 소프트 삭제? (0) | 2020.08.13 |
---|---|
C #에서 작은 코드 샘플을 벤치마킹하면이 구현을 개선 할 수 있습니까? (0) | 2020.08.13 |
Tkinter에서 창 닫기 이벤트를 어떻게 처리합니까? (0) | 2020.08.13 |
Xcode — $ (SRCROOT) 란 무엇입니까? (0) | 2020.08.13 |
여러 줄 가져 오기에 권장되는 형식이 있습니까? (0) | 2020.08.13 |