Tôi đang phải đối mặt với một lỗi biên dịch khi cố gắng sử dụng lambdas/tài liệu tham khảo chức năng với Kotlin:Chức năng Tài liệu tham khảo và lambdas
class Foo {
fun getFilteredList(){
val numbers = listOf(1, 2, 3)
numbers.filter(::isOdd) // prints [1, 3]
}
fun isOdd(x: Int): Boolean = x % 2 != 0
}
Nhưng tôi nhận được một lỗi thời gian biên dịch nói một kiểu phù hợp:
Error:(18, 16) Gradle: Type inference failed: inline fun kotlin.Iterable.filter(predicate: (T) -> kotlin.Boolean): kotlin.List cannot be applied to receiver: kotlin.List arguments: (kotlin.reflect.KFunction2) Error:(18, 23) Gradle: Type mismatch: inferred type is kotlin.reflect.KFunction2 but (kotlin.Int) -> ??? was expected Error:(18, 23) Gradle: Type mismatch: inferred type is kotlin.reflect.KFunction2 but (kotlin.Int) -> kotlin.Boolean was expected Error:(18, 25) Gradle: Left-hand side of a callable reference with a receiver parameter cannot be empty. Please specify the type of the receiver before '::' explicitly
Tôi không chắc chắn lỗi nào cũng như loại tôi nên chỉ định rõ ràng trước '::'
Câu hỏi khác: Tôi có thể sử dụng một đối tượng khác làm tham chiếu trong kotli không n? Một cái gì đó như thế này:
class Bar {
fun isOdd(x: Int): Boolean = x % 2 != 0
}
class Foo {
fun getFilteredList(){
val bar = Bar()
val numbers = listOf(1, 2, 3)
numbers.filter(bar::isOdd) // Use Bar's method
}
}
Sẽ tiện dụng, bởi vì sự thử thách. Nếu tôi vượt qua một lambda trực tiếp không có cách nào thực sự để đơn vị kiểm tra lambda chính nó. Do đó tôi đang tìm cách sử dụng một hàm, vì bản thân hàm là đơn vị có thể kiểm thử được. Theo tôi thấy bạn cũng có thể định nghĩa một hàm trong một lớp như sau: 'class Foo {val isOdd = fun (i: Int): Boolean {return i% 2! = 0}}'. Sau đó, trong lớp Foo bạn có thể chuyển 'isOdd' thay vì lambda và isOdd vẫn sẽ là unit testable. Tuy nhiên, điều này có vẻ là một cách giải quyết. Sẽ được khá tốt đẹp để có tài liệu tham khảo chức năng tương tự như java 8 chỉ để thử nghiệm đơn vị – sockeqwe
@udalov Những gì bạn có nghĩa là bởi một chức năng địa phương? Làm thế nào để bạn tạo ra một? Bởi một lambda? – voddan
Chức năng cục bộ là chức năng được khai báo trong một hàm khác, xem https://kotlinlang.org/docs/reference/functions.html#local-functions –