布尔扩展函数
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' 在静态上下文中没有意义。
当我尝试创建 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' 在静态上下文中没有意义。