`

Groovy学习:第四章 Groovy特性深入

阅读更多

作者:chszs

 

1. 断言

Java开发者常常使用JUnit或TestNG做单元测试,所以对断言是很清楚的。断言是用于验证假设的条件是否为真。在Groovy的断言中,如果假设的条件不为真,那么就会抛出java.lang.AssertionError异常。使用Groovy表达式来测试假设条件。
比如:
groovy:000> assert 1==2 : "One isn't Two"
ERROR java.lang.AssertionError:
One isn't Two. Expression: (1 == 2)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

Java的断言也是这么写的:
assert 1==2 : "One isn't Two";

可见,Groovy的断言语法与Java的断言相同,Groovy的断言可以省略分号。

断言的使用技巧:
当你使用断言时,你应用包含一条消息。此消息可以帮助其他人维护和理解你的代码,理清你的意图。

2. 强断言

Groovy的断言assert关键字仅仅是检查表达式是否为真。如果为假,断言仅仅告诉开发者,表达式不成立,以及表达式使用的变量值,除此以外什么都没有。如果使用强断言,断言的输出会提供表达式的每一个子表达式的可视化展现。下面我将详细说明强断言。

groovy:000> assert 1==1: "One isn't Two"
===> null
groovy:000> assert new File('HelloWorld.txt')==new File('Hello.txt')
ERROR org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
assert new File('HelloWorld.txt')==new File('Hello.txt')
       |                         | |
       HelloWorld.txt            | Hello.txt
                                 false
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

断言可以方便地对代码进行测试。

3. Strings

Groovy支持两种字符串:常规的Java字符串和GStrings。
在Groovy中,用单引号或双引号括起来的字符串是java.lang.String类的一个实例,

GStrings是groovy.lang.GString类的一个实例,它允许在文本中包含占位符。GStrings并不是String的子类,因为String类是final类型,而且是不能被扩充的。
GString很像普通的字符串,但是他允许在其内使用${..}嵌入变量。如果内嵌的变量只是占位符,那么可以省略{}花括号。

Groovy支持一些编程语言如Perl或Ruby所谓的字符串插入(String Interpolation)。字符串插入是字符串内的表达式或变量的替代。如果你熟悉Unix Shell编程或Ruby、Perl编程,那么你应该很熟悉这一点。

Java不支持字符串插入,你必须手动的进行值连结。

Java的字符串操作例子:
String name = "Jim";
String helloName = "Hello " + name;
System.out.println(helloName);

如果是使用Groovy的GString,那么可以这样:
groovy:000> str1 = "Li Sir"
groovy:000> str2 = "Hello "
groovy:000> println "$str2$str1"
Hello Li Sir

可见,正如前面所讲,如果内嵌的变量只是占位符,那么可以省略{}花括号。
当Groovy看到表达式内的内嵌变量时,Groovy会构造一个org.codehaus.groovy.runtime.GStringImpl来代替java.lang.String。当访问GString时,表达式会被重新计算。
注意,你可以在${}内包含任意有效的Groovy表达式,可以是方法调用或变量名。

4. 单行字符串

单行字符串可以用单引号或双引号包围,但是两者是有区别的。
单引号包围的表达式,里面的字符串插值是不会被识别的。双引号包围的表达式正好相反。

举例:
name = "LiSir"
s1 = 'Hello $name'
println s1

输出:
Hello $name

例子:
name = "LiSir"
s1 = "Hello $name"
println s1

输出:
Hello LiSir

可见,由双引号定义的字符串,其内嵌的表达式会被解释。

5. 多行字符串

Groovy支持字符串跨越多行,多行字符串由三个双引号或者三个单引号定义。
多行字符串对于创建模板(如XML模板)或内嵌的文档(SQL语句、HTML等)是非常有用的。还有很多用途。比如,可以使用多行字符串和字符串插值建立电子邮件的主体内容。
比如:
def name = "Jim"
def multiLineQuote = """
Hello, ${name}
This is a multiline string with double quotes
"""
println multiLineQuote
println multiLineQuote.class.name

def multiLineSingleQuote = '''
Hello, ${name}
This is a multiline string with single quotes
'''
println multiLineSingleQuote
println multiLineSingleQuote.class.name

输出:
Hello, Jim
This is a multiline string with double quotes
org.codehaus.groovy.runtime.GStringImpl

Hello, ${name}
This is a multiline string with single quotes

java.lang.String

6. 斜线字符串

正如早先提到的,斜线可以用于定义字符串。用斜线定义字符串有一个优点:那就是,字符串本身的内容无需转义反斜线。
比如:
def winpathQuoted = 'C:\\windows\\system32'
def winpathSlashy = /C:\windows\system32/
println winpathSlashy // C:\windows\system32
assert winpathSlashy ==~ '\\w{1}:\\\\.+\\\\.+'
assert winpathSlashy ==~ /\w{1}:\\.+\\.+/

7. 多行斜线字符串

斜线字符串还能够跨越多行。这一点对于多行正则表达式非常有用。
比如:
def name = "vishal"
def path = "c:/groovy/"
def multilineslashy = /
    Hello $name
path $path
dollar = $
path = c:\/groovy
/
println multilineslashy
输出为:
    Hello vishal
        path c:/groovy/
        dollar = $
        path = c:/groovy

8. 斜线字符串中的美元符号$

在多行斜线字符串中,如果字符串内出现斜线/,那么它需要被转义。另外,如果字符串内出现了$美元符号(没有用于表达式时),也需要转义,否则会报MissingPropertyException异常。
比如:
def name = "vishal"
def path = "c:/groovy"
def multilineSlashy = /
  Hello $name
path = $path
dollar = $test
path = c:\/groovy
/
println multilineSlashy
输出:
Exception thrown
四月 17, 2013 9:11:24 下午 org.codehaus.groovy.runtime.StackTraceUtils sanitize
WARNING: Sanitizing stacktrace:
groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
at ConsoleScript3.run(ConsoleScript3:3)
at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257)
at groovy.lang.GroovyShell.run(GroovyShell.java:481)
at groovy.lang.GroovyShell.run(GroovyShell.java:163)
at groovy.lang.GroovyShell$run.call(Unknown Source)
at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy:951)
at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at groovy.lang.Closure.call(Closure.java:411)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.run(Closure.java:492)
at java.lang.Thread.run(Thread.java:722)
groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
at ConsoleScript3.run(ConsoleScript3:3)

 

http://blog.csdn.net/chszs/article/details/8774785

分享到:
评论

相关推荐

    Groovy in action

    - **第4章:集合类型的Groovy数据**:重点介绍了Groovy中的集合数据结构,如列表(Lists)、集合(Sets)和映射(Maps),并演示了如何高效地操作这些数据结构。 - **第5章:闭包的工作原理**:深入分析了Groovy中的闭包...

    Groovy.in.Action.2nd.Edition.pdf

    本书适合想要深入学习Groovy语言的人,以及希望了解动态语言特性,并考虑使用Groovy进行实际项目开发的开发者。书中的示例代码清晰、完整,并且书中对Groovy的每个特性都做了详细解释,使读者能够快速掌握Groovy并...

    apache-groovy-sdk-4.0.1下载

    5. **src**目录:可能包含Groovy语言的源代码,对于想要深入理解Groovy工作原理或者想要参与贡献的开发者非常有用。 6. **bin目录下的脚本**:每个脚本都有相应的Windows批处理文件(.bat)和Unix/Linux shell脚本...

    Groovy in Action

    **第4章: The Collective Groovy Data Types** - **内容概述**: 探讨Groovy中的集合数据类型,如列表、集合、映射等。 - **知识点**: Groovy提供的集合类的使用方法,包括创建、遍历、修改集合的操作。 - **学习目标...

    通过groovy自定义函数实现提取明细表字段至主表字段.rar

    通过观看"通过groovy自定义函数实现提取明细表字段至主表字段.mp4"视频教程,我们可以深入学习如何在实际环境中应用这些知识点,逐步构建并优化这个功能。学习和掌握Groovy自定义函数的使用,不仅可以提升工作效率,...

    Groovy in Action源代码

    《Groovy in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Groovy编程语言,涵盖了Groovy的基础语法、高级特性以及在实际开发中的应用。源代码是书籍内容的实践部分,对于读者理解Groovy语言并进行实战...

    Beginning Groovy and Grails, From Novice to Professional

    - **高级主题**:深入探讨了Groovy和Grails的一些高级特性,如测试驱动开发(TDD)、安全性、国际化等。 - **性能优化**:讨论了如何优化Grails应用的性能,包括缓存策略、数据库查询优化等。 - **部署与维护**:...

    [Groovy入门]第五讲.将流程控制语句与方法重构为闭包

    在学习Groovy的过程中,掌握闭包这一核心概念至关重要,尤其是在重构流程控制语句和方法时。本讲我们将深入探讨如何将传统的流程控制结构和方法转换为Groovy的闭包,以提高代码的可读性和可维护性。 首先,让我们...

    ADF_Groovy(1)

    本文将深入探讨Groovy在ADF BC中的常见应用和优势。 1. **动态脚本执行** 在ADF BC中,Groovy可以用来编写动态脚本,这些脚本可以在运行时执行,提供了一种灵活的方式来处理数据或执行特定任务。例如,你可以使用...

    精通 Groovy 中文教程

    通过以上内容,读者不仅可以掌握Groovy的基础知识,还能深入了解其与Java的集成方式以及如何利用Groovy提高日常Java项目的开发效率。无论是初学者还是经验丰富的Java开发者,都能从Groovy中获益匪浅。

    Groovy need not rails——介绍自己写的一个基于groovy的框架,Webx

    通过深入学习和使用Webx,开发者可以充分利用Groovy的灵活性和生产力优势,同时享受到类似Rails的开发体验,而不必受限于Ruby语言。由于与Java平台的紧密集成,Webx还能够利用丰富的Java生态系统,为大型企业级应用...

    研究精通Groovy

    2. **掌握核心功能**:深入学习本地集合、正则表达式、闭包等高级特性,这是Groovy区别于Java的关键所在。 3. **实践编写Groovy类**:通过实际项目,将理论知识转化为实践经验,特别是在类的设计和实现方面。 4. **...

    groovy-doc-cn:groovy中文文档

    4. **GDK(Groovy Development Kit)**:Groovy扩展了Java的API,提供了一套称为Groovy Development Kit的工具集,包含了许多方便的类和方法,比如`GroovyShell`用于执行Groovy脚本,`GroovyObject`接口用于实现...

    The Groovy 2 Tutorial(LeanPub)

    《Groovy 2教程》是LeanPub上的一本推荐教程,Groovy官网也对其进行了推荐。Groovy是一种基于JVM(Java虚拟机)的敏捷...通过这些内容,读者可以建立起Groovy编程的基本框架,并为深入学习Groovy语言打下坚实的基础。

    english_Manning.Groovy.in.Action-p694.rar

    《Groovy in Action》是...通过阅读该部分的内容,你可能会遇到关于元编程、闭包、或者其他特定Groovy特性的深度讨论。无论具体内容是什么,确保结合实际练习来巩固这些理论知识,将有助于提升你的Groovy编程技能。

    grails和groovy的电子书-4

    ### 知识点:Grails和Groovy电子书(第四册) Grails是一个现代的MVC Web框架,它受到Ruby on Rails的启发,建立在稳固的砖石和最佳组件之上。Grails的开发旨在提高Web应用开发的生产效率,并使得使用强大且动态的...

Global site tag (gtag.js) - Google Analytics