Scala——定义自己的中缀运算符



采用单个参数的方法可以写成Scal中的中缀运算符。也就是说,将*(other:C) = foo(this, other)添加到类C中,将允许我们编写c1 * c2而不是foo(c1,c2(。但是,有没有一种方法可以在现有类上定义不能修改的中缀运算符?

例如,如果我想写c1 + c2而不是xor(c1,c2),其中c1,c2:Array[Byte],我显然无法修改数组类。

我发现了这个并尝试了

implicit class Bytearray(a1:Array[Byte]) extends Anyval {
    def +(a2:Array[Byte]) = xor(a1,a2)
}

但这似乎不起作用(c1 + c2(。

类型不匹配,应为:字符串,实际为:数组[Byte]

我想可能是我使用+的问题,所以我把它换成了xorc1 xor c2只导致

无法解析符号xor

有什么建议吗?

更新

有趣。我有一个class Foo,下面定义了object Foo,包含隐式类。这导致了上述错误。

但是,删除对象并将隐式类放入trait BytearrayHandling中,然后扩展它(class Foo extends BytearrayHandling(似乎有效。为什么?

它应该直接使用扩展方法的正常声明:

implicit class ByteArrayOps(private val a1: Array[Byte]) extends AnyVal {
  def + (a2: Array[Byte]): Array[Byte] = 
    (a1 zip a2).map { case (x, y) => (x ^ y).toByte }
}
"foo".getBytes + "bar".getBytes  // Array(4, 14, 29)

但是要注意,有时你会遇到这样的情况:

类型不匹配,应为:字符串,实际为:X

这是因为一个隐式转换正在启动,它允许您通过将任何内容转换为字符串来+。我已经放弃了尝试去理解如何去激活它。如果我没有错的话,它最终会在Scala2.12中运行。

正如eugener所指出的,这个错误消息可能表明您实际上还没有导入扩展方法(隐式转换(。例如:

object MyStuff {
  implicit class ByteArrayOps(private val a1: Array[Byte]) extends AnyVal {
    def + (a2: Array[Byte]): Array[Byte] = 
      (a1 zip a2).map { case (x, y) => (x ^ y).toByte }
  }
}
"foo".getBytes + "bar".getBytes  // error

给出:

<console>:14: error: type mismatch;
 found   : Array[Byte]
 required: String
              "foo".getBytes + "bar".getBytes
                                     ^

因为这种CCD_ 15转换。import MyStuff.ByteArrayOps之后,它就工作了。

您可以执行以下操作:

class ByteArray(self: Array[Byte]) {
  def +(other: Array[Byte]) = Array[Byte](1, 2, 3) // replace with your code
}
implicit def byteArrayPlus(self: Array[Byte]) = new ByteArray(self)
Array[Byte](0, 1, 2) + Array[Byte](0, 2, 3)

其最后一行应产生CCD_ 17。

相关内容

  • 没有找到相关文章

最新更新