如何在 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的实例。因为 Boolean
s 是值 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
我想要一个新的逻辑运算符。但是,当我尝试将其定义为:
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的实例。因为 实际上 -Boolean
s 是值 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