为什么 Android Studio 在创建 Fragment 时使用 let 而不是 run



Android Studio 在使用 File -> New -> Fragment 创建Fragment时会创建此代码

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}

arguments上使用run不是更好吗,因为您可以省略it?我知道你使用let来保证零安全,但run也给你Bundle,而不是Bundle?

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.run {
param1 = getString(ARG_PARAM1)
param2 = getString(ARG_PARAM2)
}
}

它使用let而不是run有什么特殊原因吗?

FWIW,这两个都没有意义,因为它们都返回一个值。

由于您不想在这种情况下返回值:

  • 如果要使用it,请使用also而不是let
  • 如果要使用接收器,请使用apply而不是run

和。。。不,我不知道为什么Android Studio会使用let而不是run

你看到那些"它"在让伴侣?这是这两者唯一不同的地方。但是,正因为如此,它们有不同的用途。首先,在运行时,调用"this"将指向调用 run 的对象。因此,首先,将调用对象具有的所有属性或方法。举个例子:

...
mObject?.run {
hello();
}
...

这将调用对象的 hello 方法。但是,假设这是相同的场景,但您希望调用与对象方法同名的函数。举个例子:

...
fun hello() = print("not the hello from that object")
...
mObject?.run {
hello();
}
...

这仍然有效,但是,您仍将从对象运行 hello。当你使用let时,你可以选择使用对象具有的方法或函数。
PS run可以自己运行,而let需要从变量等访问。

奖金

此选项还有两个适用和也适用。现在,这两者与让和运行有什么区别?Let and Run 可以返回自己或其他任何东西,或者根本不返回。同时应用,也将始终返回使用的对象。而让的对应物也是和应用是运行的。

第二奖金

假设您想在使用对象之前检查它是否为 null,然后设置不在构造函数中的属性。

var mObject: MObject = mObjectUndecided?.also {
// Do Something
}

但是,如果 mObjectUndetermined 为空怎么办?

val mObjectUndecided: MObject? = null
var mObject: MObject = mObjectUndecided?.apply{
// Do Something
} ?: run {
MObject().also {
// Do Something
}
}

但是,如果您需要调用与对象的 mathod/属性相同的函数/变量怎么办?

val mObjectUndecided: MObject? = null
var mObject: MObject = mObjectUndecided?.let{
// Do Something
it // return it if its not null
} ?: run {
MObject().also {
// Do Something
}
}

但是,如果 MObject 是这样构造的呢:

class MObject {
var name: String? = null
var mObjectNext: MObject? = null
}

然后,你必须嵌套它(运行,让,应用,也(。但是,在巢穴的某个地方,你想从更高的等级中调用一个对象吗?

var mObject: MObject = mObjectUndecided?.let{ mObject1 ->
// Do Something
mObject1.mObjectNext?.let { mObject2 ->
// Do Something
mObject2.mObjectNext?.let { mObject3 ->
// Do Something
}
// Do Something
}
// Do Something
it // return it if its not null
} ?: run {
MObject().also {
// Do Something
}
}

P.P.S. 还有另一个调用的,对于这个上下文来说,这并不重要,因为我在这里谈到了扩展函数,但它值得一读。

最新更新