加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:07:54 所属栏目:安全 来源:网络整理
导读:采用单个参数的方法可以写为Scal中的中缀运算符.即将*(其他:C)= foo(this,other)添加到C类,将允许我们编写c1 * c2而不是foo(c1,c2).但是有没有办法在现有的类上定义中缀操作符,而这些操作符无法修改? 例如.如果我想写c1 c2而不是xor(c1,c2),其中c1,c2:Arr
采用单个参数的方法可以写为Scal中的中缀运算符.即将*(其他:C)= foo(this,other)添加到C类,将允许我们编写c1 * c2而不是foo(c1,c2).但是有没有办法在现有的类上定义中缀操作符,而这些操作符无法修改?

例如.如果我想写c1 c2而不是xor(c1,c2),其中c1,c2:Array [Byte],我显然无法修改Array-Class.

我发现this并尝试过

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

但这似乎不起作用(c1 c2).

Type mismatch,expected:String,actual:Array[Byte]

我想也许这个问题是我的用法,所以我把它换成了xor
?但c1 xor c2只能导致

Cannot resolve symbol xor

有什么建议?

UPDATE

有趣.我有一个类Foo,其下面定义了一个对象Foo,包含隐式类.这导致上述错误.

但是,删除对象,而是将隐式类放入特征BytearrayHandling然后扩展它(类Foo扩展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)

但请注意,有时你会碰到这个:

Type mismatch,actual: X

这是因为隐式转换可以通过将其转换为String来实现任何操作.我有given up trying to understand如何停用它.如果我没弄错的话,它最终会进入Scala 2.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
                                     ^

因为这个Predef转换.导入MyStuff.ByteArrayOps后,它可以正常工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读