"冰冻三尺,非一日之寒"
中华文明上下五千年,老祖宗们在漫长岁月中积累沉淀的治理名言,文字已经锤炼得出神入化。诚如"冰冻三尺,非一日之寒"。学习是一个漫长积累的过程,每天进步一点点,日积月累,贵在坚持。
废话不多说,我们来开始学习Groovy语法。
Groovy的语法源自Java语言的语法,但是做了很多简化,从语言层面上就比Java敏捷。由于知识点比较多,篇幅有限,我们分成几部分来讲,主要是举一些例子,帮助童鞋们理解用法及加深印象。
注释
Groovy中的注释语法与Java语言语法完全一致,单行注释使用双斜线 // 来表示注释的开始,一直到行尾,即遇到换行符之前都是单行注释的内容,
同样多行注释使用 /* 符号开始, 之后所有的字符,包括换行符,直到遇到第一个 */ 符号之间的内容,都是多行注释。
例:
// 这是独立的单行注释
println "Hello world." // 跟随在语句后的单行注释
/* 只有一行的多行注释 */
/*
跨行的多行注释
*/
println /* 在语句中间的多行注释 */ "Hello world."
println "Hello world." /* 在行尾的多行注释 */
文档注释
如果使用Java做过开发的童鞋一定知道JavaDoc的重要性。平时我们查找Java API文档是看到的内容,就是JavaDoc工具从Java代码的文档注释提取并生成的。
Groovy同样也支持文档注释,语法也和JavaDoc一样, 使用 /** 开始,可以跨多行,直到遇到第一个 */ 符号结束。通常文档注释被用于描述类型定义,如类、接口、枚举、字段及属性的描述、方法定义等。
例:
/**
* 文件工具类,提供对目录、文件的基本操作。
* 本工具类简化文件及目录的创建、删除、更新等操作,也支持这些操作的监听事件及处理回调。
* @version 1.0
*/
class FileUtils {
/** 事件回调定义 */
def eventCallback
/**
* 递归删除指定路径下的文件及目录
* @param path 指定路径,必须是一个目录
* @return 被删除的文件总数
* @throws IOException 当无法进行删除操作,则抛出IOException
*/
long removeDir(String path) throws IOException {
...代码略
}
}
从例子可以看出,这是一个工具类,简化文件操作,并可以很明确地知道,有一个删除目录的方法,并且这个方法能够删除指定目录下包括子目录的所有文间。
所以说文档注释对于开发者有着非常重要的作用。当我们写出一个功能而需要别人调用的时候,清晰的文档会事半功倍。甚至长时间以后,开发者本身也会忘记当初自己代码为什么要这么写,所以要记住,代码是写给人看的,不是让机器看的,机器只是按照预定的逻辑执行而已。
开发的过程中,一定要写注释!
开发的过程中,一定要写注释!
开发的过程中,一定要写注释!
重要的事情说三遍!
Shell声明注释
在Unix/Linux/MacOS操作系统下,编写过脚本文件一定会记得脚本文件第一行要用
来声明此脚本的执行环境。同样,前面我们通过安装包安装了Groovy环境,并且在命令行已经可以执行了,以后就可以把Groovy脚本当作Shell脚本来用。
方法就是创建一个 shell 脚本,第一行声明为
这个脚本文件就可以按照Groovy语法来写。
例如我们创建一个名为 test.sh 的脚本文件并编辑,输入内容如下:
#!/usr/bin/env groovy
println "Hello world."
保存脚本后,将脚本修改为可执行属性,执行一下就可以看到结果了:
chmod +x test.sh
./test.sh
输出结果:
Hello world.
如果做运维的童鞋,是不是感觉眼前豁然开朗,感觉又找到了一件大杀器:)
标识符
Groovy中标识符以字母,美元符号或下划线开始,后面跟随字母或数字组成的。字符范围如下:
‘a’ 至 ‘z’ (小写ascii字母)
‘A’ 至 ‘Z’ (大写ascii字母)
‘\u00C0’ 至 ‘\u00D6’
‘\u00D8’ 至 ‘\u00F6’
‘\u00F8’ 至 ‘\u00FF’
‘\u0100’ 至 ‘\uFFFE’
注意,Java平台下的字母是UTF-8范围的,而不仅仅是ASCII 7的范围,也就是说,如果愿意,完全可以使用汉字作为标识符。
例如:
是完全没有错误的写法。
Groovy里规定,当在一个点符号后面,所有点关键字也是合法的标识符,通常这种用法用在一个对象上。
例如:
引用标识符
引用标识符出现在一个点式表达式的点后面,这点在Java语言中是不允许的。例如创建了一个user的对象,其中有一个loginId的属性,就可以通过这种方式来引用,这是一个有趣的特性,我们来展示一种用法:
为了说明这个用法,不涉及到这个特性到代码尽量用Java来定义了:
class User {
String loginId
String password
}
User user = new User()
user.'loginId' = 'a'
user.'password' = 'b'
String[] properties = new String[2]
properties[0] = 'loginId'
properties[1] = 'password'
for(String p : properties) {
println user."$"
}
assert user.loginId == 'a'
assert user.password == 'b'
这段代码一开始定义了一个User类,包含两个属性 loginId 及 password,然后使用这个类创建出一个 user 对象并对两个进行赋值,最后通过属性名获取对应的值。如果同样的功能在Java中,只能通过反射进行操作,大大增加了复杂度。而且这段代码并没有完全按照Groovy语法来写,如果完全按照Groovy语法来写,会更加简洁。
Groovy里,所有的字符串类型字面量都允许写到 . 符号后作为引用标识符:
user.'loginId'
user.'''loginId'''
user."loginId"
user."""loginId"""
user./loginId/
user.$/loginId/$
这几种字符串类型,是Groovy相对Java改进里很多的一个功能,使得字符串类型好用多了。
因篇幅原因,欲知详情,且听下回分解。
领取专属 10元无门槛券
私享最新 技术干货