Groovy重载操作符(终极版)
时间:2022-07-24
本文章向大家介绍Groovy重载操作符(终极版),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近在研究JSonpath
在接口验证和接口串联之间的应用,目前进度尚可,已经在语法封装上有了一个思路。借助Groovy
重载操作符的特性,适配一部分类似于=
、>
、>=
和classType
这样的验证功能,重新翻起来了《Groovy in action》这本神书,重新复习了一下,再看看自己之前写过的Groovy重载操作符,有点对不住读者。
特意将官方API
里面所有的操作符重载都实现了一遍,对于一些疑问做了一些注释,这里有两个操作符未能实现:-
和+
,这并不是加
和减
,而是表示正负值的,Groovy
里面是可以直接对对象使用这两个操作符来完成数值的正负转换
,对于List
对象同样适用。但是这两个操作符只能对数值型和数值型List使用,目前尚未解决这个操作符的其他类型使用的方案。
- 这里需要注意
++
和--
操作符,Groovy
没有区分前后,而且根据实现逻辑会最终赋值给当前对象,所以需要一个返回值,不然很容易报空指针异常,当然也可以通过?.
安全引用来避免,这个有空再讲了。文档中:Groovy还可以重写.
这个操作符,有兴趣的同学可以一起研究。
Demo代码
package com.fun.utils
import com.fun.frame.SourceCode
/**
* 操作符重写类,用于匹配JSonpath验证语法
*/
class Verify extends SourceCode implements Comparable {
def plus(int i) {
logger.info("操作符: + {}", i)
}
def minus(int i) {
logger.info("操作符: - {}", i)
}
def multiply(int i) {
logger.info("操作符: * {}", i)
}
def div(int i) {
logger.info("操作符: / {}", i)
}
def mod(int i) {
logger.info("操作符: % {}", i)
}
/**
* 必需有返回值
* <p>
* defv=a;a=a.next();v a = a.next(); a
* </p>
*
* @return
*/
def next() {
logger.info("操作符: i++ 或者 ++i")
this
}
/**
* 必需有返回值
* <p>
* defv=a;a= a.previous(); v
* </p>
*
* @return
*/
def previous() {
logger.info("操作符: i-- 或者 --i")
this
}
def power(Verify verify) {
logger.info("操作符: ** ${verify}")
}
def or(Verify verify) {
logger.info("操作符: | ${verify}")
}
def and(Verify verify) {
logger.info("操作符: & ${verify}")
}
def xor(Verify verify) {
logger.info("操作符: ^ ${verify}")
}
def bitwiseNegate() {
logger.info("操作符: ~i")
}
def getAt(int a = 3) {
logger.info("操作符: i[${a}]")
}
def putAt(int a = 3, int c = 3) {
logger.info("操作符: i[${a}]=${c}")
}
def leftShift(Verify verify) {
logger.info("操作符: << ${verify}")
}
def rightShift(Verify verify) {
logger.info("操作符: >> ${verify}")
}
def rightShiftUnsigned(Verify verify) {
logger.info("操作符: >>> ${verify}")
}
def isCase(Verify verify) {
logger.info("操作符: case ${verify}")
true
}
/**
* if (a implements Comparable) { a.compareTo(b) == 0 } else { a.equals(b) }* @param a
* @return
*/
def equals(Verify verify) {
logger.info("操作符: == ${verify}")
//todo:重写
true
}
/**
* a <=> b a.compareTo(b)
* a>b a.compareTo(b) > 0
* a>=b a.compareTo(b) >= 0
* a<b a.compareTo(b) < 0
* a<=b a.compareTo(b) <= 0
* @param o
* @return
*/
@Override
int compareTo(Object o) {
logger.info("操作符: <=> >= > < 等等")
//todo:重写
return 0
}
def <T> T asType(Class<T> tClass) {
logger.info(tClass.toString())
if (tClass.equals(Integer)) 4
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kubernetes 中 Informer 的使用
- 嵌入式开发中常见3个的C语言技巧
- 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的
- 有了MinIO,你还会用FastDFS么?
- STP 实验
- 算法集锦(6) |基于GPU框架的tensorflow数据增强算法
- 交换机端口安全实验
- 算法集锦(7)| 实用代码 | Google Colab使用及配置技巧
- 浏览器标签页分屏_不同浏览器同一个tab里面怎么实现分屏?#技能get#
- 微信小程序开发实战(16):交互组件
- Linux常用命令
- 一日一技:使用异或寻找两个孤独的数
- Chrome 85的Referrer-Policy调整对网站分析工具的影响
- 同时搞定Android和iOS的Dart语言(1):Dart初探
- Linux进程控制