2017-05-05 50 views
3

在连接到蓝牙设备的应用程序,我使用的使用RxKotlin以下功能:的Rx科特林:地图功能无法推断返回类型

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 
     } 
} 

这个函数应该简单地与后台连接BluetoothDevice类然后用套接字做一些事情(再次在mainthread中)。然而,map不能处理return socket部分,告诉我有一个Type mismatch,它发现一个BluetoothSocket它需要一个Unit

这里怎么回事?我认为地图应该能够推断返回类型。

+0

您是否尝试过'return @ scan'而不是'return'? – Rehan

+0

@Rehan:谢谢,那可行! (或者至少,它不再抱怨了,现在不能测试)但是对于我来说,'scan'看起来像纯粹的魔法......这是干什么用的?谨慎阐述? – Marcel50506

+1

它用于避免模糊和返回嵌套函数中的值,就像上面的情况一样。自从我上周更新kotlin插件以来,我已经看到了android工作室的建议。你可以在这里阅读更多细节(https://kotlinlang.org/docs/reference/returns.html#return-at-labels)和[here](http://kotlinlang.org/docs/reference/lambdas。 html#lambda-expression-syntax):) – Rehan

回答

15

在你的地图功能与

[email protected] socket 

因为回报语句通常用于返回顶级函数值代替声明

return socket 

。对于lambda表达式和内嵌(嵌套)函数,请在标签处使用返回,即return @ {method_name}。你也可以把最后一行留在socket的情况下,编译器会为你处理它,假设最后一行是内联函数的返回值。但为了更好的可读性,我绝对会选择合格的返回语法。您可以在kotlin文档中阅读更多详细信息herehere

+0

谢谢你哥们<3 –