布尔扩展函数

时间:2017-08-29 19:03:06

标签: boolean kotlin kotlin-extension

当我尝试创建扩展函数以设置布尔值true或false时,如下所示。

Boolean.setTrue(){
 this = true
}

Boolean.setFalse(){
 this = false
}

它表示预期变量。如何实现这一点。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

抱歉,但这没有意义。只需使用myBool=false,这是任何人都能理解的内容,并且无法获得更多可读性。 此外Boolean 不可变,无论如何你都不可能尝试。

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

答案 2 :(得分:2)

您无法执行此操作的原因是您无法在扩展功能中重新分配接收器。

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

答案 3 :(得分:1)

这是在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();

我不知道此扩展方法可能有什么弊端。

答案 4 :(得分:0)

之所以可以这样做,是因为Kotlin扩展的实现是静态的(甚至可能是静态的),这是由于Kotlin扩展的实施缺乏。 因此,在静态上下文中使用“ this”是没有意义的。