我知道代码C与代码A相同。
我希望在代码B中使用该变量,aa
而不是it
在代码中,但这会导致错误。
为什么代码B与代码A不同?
代码A
private var aa:String?=null aa?.let{ print(it.length) }
代码B
private var aa:String?=null aa?.let{ print(aa.length) }
代码C
private var aa:String?=null aa?.let{ aa-> print(aa.length) }
PPartisan.. 6
it
只是kotlin隐式为参数赋予的名称,您可以使用自己的名称覆盖该名称(在C中,参数名称设置为aa
)。
在A中,您将其it
用作隐式参数,它所指的值等于aa
经过空检查后的值。
B不起作用,因为与C和A中的不同,B aa
是指var
您在外部声明的let
,可以为空。因为它可以为空,所以不能简单地length
以与A和C中相同的方式对其进行调用。
it
只是kotlin隐式为参数赋予的名称,您可以使用自己的名称覆盖该名称(在C中,参数名称设置为aa
)。
在A中,您将其it
用作隐式参数,它所指的值等于aa
经过空检查后的值。
B不起作用,因为与C和A中的不同,B aa
是指var
您在外部声明的let
,可以为空。因为它可以为空,所以不能简单地length
以与A和C中相同的方式对其进行调用。
是的,您可以使用aa
内部T.let
函数,但是问题在于它不会被强制转换为对象,因此要么手动将其强制强制转换,要么将无法使用变量类型的方法。
我建议您阅读此参数的隐式名称,以更好地理解it
。
@PPartisan很好解释了,是的,您可以aa
在T.let
函数内使用您遇到的问题是编译器试图对其进行智能转换String
,并且不可能这样做,因为这aa
是一个可变属性,可能具有被改变了。
如果您尝试添加其他功能,isNullOrBlank()
它不会抱怨。
还有一点是,T.let
函数正在检查可为空性,如果aa
为null,则即使您放入,它也不会做任何内部操作it
,aa
因此示例可能是:
private var aa:String?=null fun main() { println("Hello, world!!!") aa = "pewlas" aa?.let{ print("example"+aa.orEmpty()) } }
输出:
你好,世界!!!
例子
当您使用it
它时,它将强制转换为String
so,如果您aa
在T.let
函数内部使用它将不会将其强制转换为String,那么您将无法使用String
尝试使用lenght
函数的方法。