1. 介绍
本篇开始,将基于Groovy官方文档中的语义模块:Groovy Language Documentation (groovy-lang.org) 完整详细的学习Groovy语言的各种基本语义知识。
很多的语义的相关实现,在之前的笔记中都有使用。
但是可能并没有详细介绍每个语法的含义。这里就是开始详细的进行说明。
如果想入手Groovy的学习,其实完全可以从这篇内容开始的。
下面,让我们进入正文吧。
2. 语句
介绍一种语言,其实如果已经有一点点的使用经验之后,再回过头来梳理一下语义知识点,会更方便我们记忆,因为会有一种恍然大悟的感觉。
2.1 变量定义-def和var
在Groovy中,变量可以使用它们的类型(如String
,int
,boolean
等),也可以使用关键字def
(或var
)后跟变量名来定义:
String x //定义了一个变量x,数据类型String
def y //定义了一个变量y,数据类型不确定,根据传值动态匹配
var z //定义了一个变量z,数据类型不确定,根据传值动态匹配
def
和var
充当类型占位符,即当你不想给出显式类型时,替换类型名。可能是在编译时不关心类型,或者依赖于类型推断(使用Groovy
的静态特性)。变量定义必须有类型或占位符。如果省略,类型名将被视为引用现有变量(假设在前面声明过)。对于脚本,未声明的变量被假定来自脚本绑定。在其他情况下,会得到一个丢失的属性(动态Groovy
)或编译时错误(静态Groovy
)。
PS:var 和def到底有什么区别,暂时我也没有弄明白。但是见到比较多的Grovoy的脚本中使用的是def做类型占位符。
2.2 变量赋值
为groovy
创建的变量进行赋值很简单,通过=
号实现就可以了,示例如下:
x = 1
println x //输出1
x = new java.util.Date()
println x //输出:Sun Dec 04 17:56:31 CST 2022
x = -3.14159
println x //输出-3.14159
x = false
println x //输出 false
x = "Hi zinyan.com"
println x //输出 Hi zinyan.com
2.2.1 多重赋值
Groovy支持多重赋值,即可以同时赋值多个变量,例如:
代码语言:javascript复制//创建了三个变量,分别给它们复制
def (a, b, c) = [10, false, 'zinyan.com']
println a //输出:10
println b //输出:false
println c //输出: zinyan.com
我们也可以在声明的时候对参数进行属性定义:
代码语言:javascript复制def (int i, String j) = [1024, 'zinyan.com']
println i //输出:1024
println j //输出: zinyan.com
除了在声明变量时使用,它还适用于现有变量:
代码语言:javascript复制def nums = [1, 3, 5] //这其实就创建了一个集合对象了。可以通过:https://zinyan.com/?p=392 了解更多集合知识点
def a, b, c
(a, b, c) = nums
println a //输出:1
println b //输出:3
println c //输出: 5
该语法适用于数组和列表,以及返回以下任何一种方法:
代码语言:javascript复制//_代表空值占位
def (_, month, days) = "2022 12 03".split() //将字符串进行空格拆分
println "时间是: $month 月 $days 日" //输出:时间是: 12月 03 日
2.2.2 溢流与下溢
如果左边有太多的变量,多余的将用null填充:
代码语言:javascript复制def (a, b, c) = [1, 2]
println a //输出:1
println b //输出:2
println c //输出: null
如果右边有太多变量,多余的变量会被忽略:
代码语言:javascript复制def (a, b) = [1, 2, 3]
println a //输出:1
println b //输出:2
可以看到数值3会被直接抛弃。
如果想取数值3 可以参考上面的_
占位符使用。
2.2.3 使用多重赋值的对象解构
在描述Groovy操作符的部分中,我们介绍了下标操作符的情况,解释了如何重写getAt()
/putAt()
方法。11. Groovy 运算符-区间运算符,下标运算符,钻石运算符等学习 (zinyan.com)
通过这种技术,我们可以结合多个赋值和下标操作符方法来实现对象解构。
考虑以下不可变的Coordinates
类,它包含一对经度和纬度双精度值,并注意getAt()
方法的实现:
import groovy.transform.Immutable
@Immutable
class Coordinates {
double latitude //定义变量,纬度
double longitude //定义变量 经度
double getAt(int idx) {
if (idx == 0) latitude
else if (idx == 1) longitude
else throw new Exception("Wrong coordinate index, use 0 or 1")
}
}
现在让我们实例化这个类并分解它的经度和纬度:
代码语言:javascript复制def coordinates = new Coordinates(latitude: 43.23, longitude: 3.67)
def (la, lo) = coordinates
paintln la //输出: 43.23
paintln lo //输出:3.67
我们结合代码就能理解它们中间的解构逻辑了。
注意,我们直接使用变量的时候,其实就是调用了该对象的变量的get
和put
方法哦。
3. 小结
本篇内容到这里就结束了,简单的学习了Groovy的变量创建和变量赋值操作。
相关知识内容可以参考Groovy官方文档:Groovy Language Documentation (groovy-lang.org) 学习。如果觉得官方文档理解有问题,可以参考我的学习笔记。
如果觉得我总结的还可以,希望能够给我点个赞,鼓励一下。谢谢。