Kotlin分配的意外值
lambdas和函数链接有问题,行为异常。 请参见代码中的注释:Kotlin分配的意外值,kotlin,Kotlin,lambdas和函数链接有问题,行为异常。 请参见代码中的注释: class User() { var i = 0 fun simpleFoo() { println("Unit") } } class Either { lateinit var b: User fun foo(fnR: (User) -> Any): Any = fnR(b) } class A { fun main() { val
class User() {
var i = 0
fun simpleFoo() {
println("Unit")
}
}
class Either {
lateinit var b: User
fun foo(fnR: (User) -> Any): Any = fnR(b)
}
class A {
fun main() {
val either = Either<User>()
either.foo(::handleUser) // works fine
either.foo() { user ->
user.i = 3 // Expected value of type Any
}
}
fun handleUser(user: User) {
user.simpleFoo()
}
}
class用户(){
变量i=0
有趣的simplefo(){
println(“单位”)
}
}
类或{
lateinit变量b:用户
fun-foo(fnR:(用户)->Any):Any=fnR(b)
}
甲级{
主要内容(){
val或=或()
foo(::handleUser)//工作正常
foo(){user->
user.i=3//任何类型的预期值
}
}
fun handleUser(用户:用户){
user.simplefo()
}
}
发生这种情况是因为Kotlin中的赋值不是表达式。所以它不会返回单位
解决方法是只使用函数链接
either.foo(::handleUser) // works fine
这是因为Kotlin中的赋值不是表达式。所以它不会返回单位 解决方法是只使用函数链接
either.foo(::handleUser) // works fine
像
eather.foo(::handleUser)
这样的函数链接是可以的,但是如果您想使用lambda表达式,那么在您的例子中您犯了一个错误。你的职能
fun foo(fnR: (User) -> Any): Any = fnR(b)
接收一个返回类型为Any
的值的函数,因此必须从lambda返回类型为Any
的值(忘记返回值),如:
像
eather.foo(::handleUser)
这样的函数链接是可以的,但是如果您想使用lambda表达式,那么在您的例子中您犯了一个错误。你的职能
fun foo(fnR: (User) -> Any): Any = fnR(b)
接收一个返回类型为Any
的值的函数,因此必须从lambda返回类型为Any
的值(忘记返回值),如:
@Tenfour04是的,我的误解,纠正了。@Tenfour04是的,我的误解,纠正了。