如何在 Scala 中定义我自己的布尔逻辑运算符

How to define my own logical operator on Booleans in Scala

我想要一个新的逻辑运算符。但是,当我尝试将其定义为:

def xor (that: Boolean): Boolean = (this || that) && !(this && that)

然后使用它,我得到以下错误:

value xor is not a member of Boolean

xor 定义位于同一 class 中,就在我正在使用它的函数之前。

运算符定义的正确位置是什么?

我不确定你是否知道它,但 Scala 中已经有一个按位异或运算符 (^),你可能更喜欢它。

要为布尔值添加扩展方法,您不能简单地定义一个带有 2 个参数的函数。您必须将布尔值包装在隐式 class 中并在其上定义适当的方法。

implicit class Xorable(private val a: Boolean) extends AnyVal {
  def xor(b: Boolean) = a ^ b
}

只有这样你才能像true xor false一样使用它。您在上面定义的方法只能用作 xor(a, b)

编辑:正如 Luis Miguel Mejía Suárez 指出的那样

It is usually a good idea to make your implicit classes to be value classes.

唯一的问题是你不能有一个隐式值class,其参数是另一个值class的实例。因为 Booleans 是值 classes,所以在这种情况下你必须要么不使用值 classes 要么做一个隐式定义,但对于 AnyRef 的后代, 你可以只添加一个 extends AnyVal 到第一个隐式 class. 实际上 -

The restriction only apply to user-defined value classes, you can make the implicit class of booleans to be a value class

顺便说一句,据我所知,您可以在 Dotty 中执行此操作:

def (a: Boolean) xor (b: Boolean) = a ^ b