【问题标题】:Rx Kotlin: map function can't infer return typeRx Kotlin:映射函数无法推断返回类型
【发布时间】:2017-05-05 14:04:38
【问题描述】:

在连接蓝牙设备的应用中,我使用 RxKotlin 使用以下功能:

private fun startBluetoothPair(device: BluetoothDevice) {
    Observable.just(device)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .map {
            var uuid: UUID = BLUETOOTH_UUID
            var socket = it.createRfcommSocketToServiceRecord(uuid)
            socket.connect()
            return socket
        }
        .subscribe {
            // Do something with the BluetoothSocket
        }
}

这个函数应该简单地在后台连接蓝牙设备,然后对套接字做一些事情(再次在主线程中)。但是,map 无法处理return socket 部分,告诉我有一个Type mismatch,它在需要Unit 的地方找到了一个BluetoothSocket。

这里出了什么问题?我认为地图应该能够推断出返回类型。

【问题讨论】:

  • 你试过return@scan而不是return吗?
  • @Rehan:谢谢,这行得通! (或者至少,它不再抱怨,现在无法测试)但对我来说,scan 看起来像纯粹的魔法......这是做什么的?需要详细说明吗?
  • 它用于避免歧义并在嵌套函数中返回值,如上述情况。自从我上周更新了 kotlin 插件以来,我已经看到 android studio 提出了更多建议。您可以阅读更多详细信息 here 和 here :)

标签: android reactivex rx-kotlin


【解决方案1】:

在你的地图函数中替换语句

return socket

与

return@map socket

因为 return 语句通常用于返回顶级函数的值。对于 lambda 表达式和内联(嵌套)函数,请在标签处使用返回,即 return@{method_name}。您也可以将最后一行留给 socket 在这种情况下,编译器会为您处理它,假设最后一行作为内联函数的返回值。但是为了更好的可读性,我肯定会更喜欢合格的返回语法。您可以在 kotlin 文档 here 和 here 中阅读更多详细信息

【讨论】:

  • 谢谢你的朋友
  • 谢谢!我试图让 Kotlin map 做我需要它做的事情,我快疯了。为什么不像其他语言已经在做的那样做?
【解决方案2】:

在这种情况下,只需简单地跳过使用 return 关键字!最后一条语句将是返回表达式:

.map {
  val uuid: UUID = BLUETOOTH_UUID
  val socket = it.createRfcommSocketToServiceRecord(uuid)
  socket.connect()
  socket
}

建议避免使用return@map 等带标签的表达式,因为它易于维护且复杂度较低。

对这些变量使用val 而不是var 也是一种很好的做法,因为您不会重新分配它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多