【问题标题】:Boolean extension function布尔扩展函数
【发布时间】:2017-08-29 19:03:05
【问题描述】:

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

Boolean.setTrue(){
 this = true
}

Boolean.setFalse(){
 this = false
}

它说预期变量。如何做到这一点。

【问题讨论】:

  • 什么情况下需要这个?
  • 使代码更具可读性。
  • 没有比 myBool = false 更易读的了
  • 通常你会因为不遵循通常的约定而降低代码的可读性。无论哪种方式都没有关系,因为您永远无法更改 this 的值,扩展功能与否。
  • 补充一点,如果你可以重新定义它,你可以使用它来使构造函数可能返回不是它作为构造函数的类的实例,这真的会混淆代码(如果你可以的话,在纯 Java 中)这样做你甚至可以创建一个返回 null 的构造函数,这真的会打破许多通常安全的假设)

标签: boolean kotlin kotlin-extension


【解决方案1】:

您无法更改 this 的值,这会打破很多假设,即使您可以更改值,您也无法更改值,因为布尔值是不可变的。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案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();
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-06
            • 2011-10-17
            • 2012-01-23
            • 2017-11-07
            相关资源
            最近更新 更多