布尔扩展函数

Boolean extension function

当我尝试创建 Extension Function 来设置布尔值 true 或 false 时,如下所示。

Boolean.setTrue(){
 this = true
}

Boolean.setFalse(){
 this = false
}

它说 预期变量。如何实现。

你不能这样做的原因是你不能在扩展函数中重新分配接收器。

无法更改布尔值,因为它是不可变的。

抱歉,这没有意义。就用myBool=false,这是任何人都能理解的,无法再提高可读性了。 另外 Boolean 不可变的 并且你正在尝试的无论如何都是不可能的。

我们必须小心不要过度使用扩展。这是 Kotlin(和其他)提供的最重要的功能之一,但在某些示例中,例如试图改变一个简单的 Boolean 的分配方式,恕我直言,它变得很危险(幸运的是,这是不可能的)。

你不能改变它的值,这会打破很多假设,即使你可以你也不能改变这个值,因为布尔值是不可变的。

更一般地说,在简化代码和使其更复杂之间有一条微妙的界限,在这种情况下会使代码复杂化。我同意添加 String.splitByDot() 可能有意义,但替换惯用代码往往只会使代码更复杂,因为您开始想知道为什么必须替换代码。

这是一个适用于 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();

我不知道这种扩展方法可能有什么缺点。

你能做到这一点的原因是缺少 Kotlin 扩展的实现,这可能是因为 Kotlin 中的扩展是静态解析的(甚至可能真的是静态的)。 所以 'this' 在静态上下文中没有意义。