当我尝试创建扩展函数以设置布尔值true或false时,如下所示。
Boolean.setTrue(){
this = true
}
Boolean.setFalse(){
this = false
}
它表示预期变量。如何实现这一点。
答案 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”是没有意义的。