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

e1xvtsh3  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(89)

我想有一个新的逻辑运算符。然而,当我试图将它定义为:
第一个月
然后使用它,我得到以下错误:
值xor不是Boolean的成员

  • xor* 定义位于同一个类中,就在我使用它的函数之前。

操作符定义应该放在什么位置?

pvcm50d1

pvcm50d11#

我不确定你是否知道,但Scala中已经有了一个按位XOR运算符(^),你可能更喜欢它。
要给布尔值添加扩展方法,你不能简单地定义一个带两个参数的函数,你必须把布尔值 Package 在一个隐式类中,并在其上定义一个适当的方法。

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

字符串
只有这样你才能像true xor false一样使用它。上面定义的方法只能像xor(a, b)一样使用
编辑:正如路易斯·米格尔·梅希亚·苏亚雷斯指出的那样
将隐式类设置为值类通常是一个好主意。
唯一的一点是,你不能有一个隐式值类,它的参数是另一个值类的示例。因为Boolean s是值类,所以你要么不使用值类,要么在这种情况下创建一个隐式def,但是对于AnyRef的后代,你可以只在第一个隐式类中添加一个extends AnyVal。实际上-
该限制仅适用于用户定义的值类,您可以将布尔值的隐式类设置为值类
顺便说一下,你可以在Scala 3中使用一个扩展方法更容易地做到这一点:

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

相关问题