6

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

Boolean.setTrue(){
 this = true
}

Boolean.setFalse(){
 this = false
}

它说变量 expected。如何实现这一点。

4

5 回答 5

6

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

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

于 2017-08-29T19:23:46.240 回答
3

对不起,但这没有意义。只需使用myBool=false,这是任何人都理解的,并且无法获得更多可读性。也是Boolean不可的,无论如何你正在尝试的东西是不可能的。

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

于 2017-08-29T19:15:56.657 回答
3

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

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

于 2018-06-25T23:23:25.603 回答
2

您不能这样做的原因是您无法在扩展功能中重新分配接收器。

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

于 2017-08-29T19:14:06.403 回答
0

您可以这样做的原因是缺少 Kotlin 扩展的实现,这可能是因为 Kotlin 中的扩展是静态解析的(甚至可能是静态的)。因此,静态上下文中的“this”没有意义。

于 2019-07-20T16:41:48.473 回答