当我尝试创建扩展函数来设置布尔值 true 或 false 时,如下所示。
Boolean.setTrue(){
this = true
}
Boolean.setFalse(){
this = false
}
它说变量 expected。如何实现这一点。
当我尝试创建扩展函数来设置布尔值 true 或 false 时,如下所示。
Boolean.setTrue(){
this = true
}
Boolean.setFalse(){
this = false
}
它说变量 expected。如何实现这一点。
你不能改变这个值,这会打破很多假设,即使你可以你也不能改变这个值,因为布尔值是不可变的。
更一般地说,在简化代码和使其更复杂之间有一条细线,在这种情况下会使代码复杂化。我同意添加String.splitByDot()
可能有意义,但是替换惯用代码往往只会使代码更复杂,因为您开始想知道为什么必须替换代码。
对不起,但这没有意义。只需使用myBool=false
,这是任何人都理解的,并且无法获得更多可读性。也是Boolean
不可变的,无论如何你正在尝试的东西是不可能的。
我们必须小心不要过度使用扩展。这是 Kotlin(和其他)提供的最伟大的功能之一,但在某些示例中,例如试图改变Boolean
分配死简单的方式,恕我直言,它变得危险(幸运的是这是不可能的)。
这是在 C# 7.2 或更高版本中工作的扩展方法:
public static class Extensions
{
public static bool Toggle(ref this bool b) => b = !b;
}
然后在其他地方,这样的事情会起作用:
bool b1 = true; // Works for primitive bool type.
Boolean b2 = true; // Works for Boolean object, too.
b1.Toggle();
b2.Toggle();
我看到使用扩展方法的唯一好处是用长布尔表达式缩短行,例如替换:
this.SomeObjectWithALongName.SomeVerboselyNamedProperty
= !this.SomeObjectWithALongName.SomeVerboselyNamedProperty
和
this.SomeObjectWithALongName.SomeVerboselyNamedProperty.Toggle();
我不知道这种扩展方法可能有什么缺点。
您不能这样做的原因是您无法在扩展功能中重新分配接收器。
无法更改 Boolean 的值,因为它是不可变的。
您可以这样做的原因是缺少 Kotlin 扩展的实现,这可能是因为 Kotlin 中的扩展是静态解析的(甚至可能是静态的)。因此,静态上下文中的“this”没有意义。