29. Groovy 语法-变量定义与多重赋值

2023-02-23 17:42:48 浏览数 (2)

1. 介绍

本篇开始,将基于Groovy官方文档中的语义模块:Groovy Language Documentation (groovy-lang.org) 完整详细的学习Groovy语言的各种基本语义知识。

很多的语义的相关实现,在之前的笔记中都有使用。

但是可能并没有详细介绍每个语法的含义。这里就是开始详细的进行说明。

如果想入手Groovy的学习,其实完全可以从这篇内容开始的。

下面,让我们进入正文吧。

2. 语句

介绍一种语言,其实如果已经有一点点的使用经验之后,再回过头来梳理一下语义知识点,会更方便我们记忆,因为会有一种恍然大悟的感觉。

2.1 变量定义-def和var

在Groovy中,变量可以使用它们的类型(如Stringint,boolean等),也可以使用关键字def(或var)后跟变量名来定义:

代码语言:javascript复制
String x  //定义了一个变量x,数据类型String
def y     //定义了一个变量y,数据类型不确定,根据传值动态匹配
var z    //定义了一个变量z,数据类型不确定,根据传值动态匹配

defvar充当类型占位符,即当你不想给出显式类型时,替换类型名。可能是在编译时不关心类型,或者依赖于类型推断(使用Groovy的静态特性)。变量定义必须有类型或占位符。如果省略,类型名将被视为引用现有变量(假设在前面声明过)。对于脚本,未声明的变量被假定来自脚本绑定。在其他情况下,会得到一个丢失的属性(动态Groovy)或编译时错误(静态Groovy)。

PS:var 和def到底有什么区别,暂时我也没有弄明白。但是见到比较多的Grovoy的脚本中使用的是def做类型占位符。

2.2 变量赋值

groovy创建的变量进行赋值很简单,通过=号实现就可以了,示例如下:

代码语言:javascript复制
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()方法的实现:

代码语言:javascript复制
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

我们结合代码就能理解它们中间的解构逻辑了。

注意,我们直接使用变量的时候,其实就是调用了该对象的变量的getput方法哦。

3. 小结

本篇内容到这里就结束了,简单的学习了Groovy的变量创建和变量赋值操作。

相关知识内容可以参考Groovy官方文档:Groovy Language Documentation (groovy-lang.org) 学习。如果觉得官方文档理解有问题,可以参考我的学习笔记。

如果觉得我总结的还可以,希望能够给我点个赞,鼓励一下。谢谢。

0 人点赞