我想有一个新的逻辑运算符。然而,当我试图将它定义为:第一个月然后使用它,我得到以下错误:值xor不是Boolean的成员
操作符定义应该放在什么位置?
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中使用一个扩展方法更容易地做到这一点:
true xor false
xor(a, b)
Boolean
AnyRef
extends AnyVal
extension (a: Boolean) def xor(b: Boolean) = a ^ b
型
1条答案
按热度按时间pvcm50d11#
我不确定你是否知道,但Scala中已经有了一个按位XOR运算符(
^
),你可能更喜欢它。要给布尔值添加扩展方法,你不能简单地定义一个带两个参数的函数,你必须把布尔值 Package 在一个隐式类中,并在其上定义一个适当的方法。
字符串
只有这样你才能像
true xor false
一样使用它。上面定义的方法只能像xor(a, b)
一样使用编辑:正如路易斯·米格尔·梅希亚·苏亚雷斯指出的那样
将隐式类设置为值类通常是一个好主意。
唯一的一点是,你不能有一个隐式值类,它的参数是另一个值类的示例。因为
Boolean
s是值类,所以你要么不使用值类,要么在这种情况下创建一个隐式def,但是对于AnyRef
的后代,你可以只在第一个隐式类中添加一个extends AnyVal
。实际上-该限制仅适用于用户定义的值类,您可以将布尔值的隐式类设置为值类
顺便说一下,你可以在Scala 3中使用一个扩展方法更容易地做到这一点:
型