Scala – 定义自己的中缀运算符
采用单个参数的方法可以写为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).
我想也许这个问题是我的用法,所以我把它换成了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) 但请注意,有时你会碰到这个:
这是因为隐式转换可以通过将其转换为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后,它可以正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Docker Beta for Mac的证书文件夹在哪里
- 使用装饰器在Angular 2中使用TypeScript进行验证
- angularjs2 依赖注入
- SCALA应用程序的Gradle init项目
- 【ionic 3】cannot find module ‘@ionic/cli-utils/bootst
- twitter-bootstrap – Bootstrap导航栏边距
- scala – 不同子项目中的Play Framework演变
- 《数据结构》实验一: VC编程工具的灵活使用
- scala – 如何访问由RandomForestClassifier(spark.ml-vers
- webservice入门课程02