Groovy学习第一课

最近想要groovy来编写自动化测试脚本,想到使用groovy,不外乎几个原因。

第一,同样是基于JVM虚拟机,这对于一个工作了2年多的javaer驾轻就熟;

第二,代码简洁;

第三,可以使用EclipseIDE工具装上groovy plugin;

第四,图个新鲜感;

第五,可以使用java的api;

第六,了解groovy编写桌面客户端,非常之容易

在看了groovy的官网的操作指南,基本语法跟动态语言差不多,唯独它提出了闭包这个概念,非常吸引我。

所以本章就从闭包开始谈起。

 Groovy 中的闭包是一个匿名的代码块,可以接受参数,并返回一个返回值,也可以引用和使用在它周围的,可见域中定义的变量。在许多方面,它看起来像 java 中的匿名内部类,并且闭包的用法也确实像大多数 java 开发者使用匿名内部类的方式。

上面的是官方的介绍,但是从本人感觉闭包比其java的匿名类用的更人有创新,可以通俗的理解就是代码块,也是是一个方法或许类,到最后都是closure的子类。

标准的格式是:

//这里的 [closureArguments->] 是一个可选的,逗号分隔的参数列表。statements 由 0个或多个 Groovy 语句构成。参数列表看起来有点像方法的参数列表,它们可能带类型声明,可能不带。如果指定了一个参数列表,则 符号 -> 必须出现,以分离参数列表和闭包体。statements 部分可以由 0 个,1个,或很多的 Groovy语句构成。
难以理解的部分是->,其实我们可以理解->左边部分就是参数列表,右边部分又是另外的闭包体(受外围闭包限制)

{ [closureArguments->] statements }package com.groovyapp.auto

{ item++ }
 
{ println it }
 
{ ++it }
 
{ name -> println name }
 
{ String x, int y -> println "hey ${x} the value is ${y}" }
 
{ reader ->
  while (true) {
      def line = reader.readLine()
  }
}
 
class HiddenMember {
	private String name="cyyyyyy";

	def getClosure (String name) {
		return { println (name)}
	}
	//为了判断参数中到底来源形参,还是自身成员变量值,通过ower关键字有点像this
	def getClosure2(String name){
		return { name3 -> println ("Argument: ${name}, Object: ${owner.name}")}
	}
}
//闭包的产生条件,从堆栈中,实例化后放入堆中,jvm衍生物
HiddenMember menmber=new HiddenMember();
//创建了两个闭包,当闭包的周围代码触及到它们时,闭包才被隐性的创建,而不能像new关键字
def closureVar = menmber.getClosure("Xavier");
def closureVar2 = menmber.getClosure2("Xavier");
//以下两种方式都可以,第一种默认调用call()方法
closureVar();
closureVar2.call();


//调味闭包
def c = { arg1, arg2-> println "${arg1} ${arg2}" }
//固定参数
def d = c.curry("foo")
d("bar")

闭包可以接收 1....N 个参数,这些参数可以静态的声明其类型,也可以不声明类型。第一个参数是一个未声明类型的隐含变量叫 “it” ,

 如果没有其他显式的参数声明的话。如果调用者没有声明任何参数,则第一个参数(并且扩展为 it)将为 null。

我觉得取这个参数的名称“it”有点匪夷所思,不过其用处还是相当明显的package com.groovyapp.auto

import groovy.lang.Closure;


class SomeCollection {
	public void each (Closure c){
	}
}


SomeCollection stuff = new SomeCollection();
stuff.each() { println it }

def names=[
	"four",
	"two",
	"tommy",
	"jacky"
]
//println names;
//通过names,第一个参数的名称就默认是it
names.each {println it}
//闭包同样可以作为map的key或者value,都是允许的
f = { println "f called" }
m = [ (f): 123 ]
println m.get(f);
 

猜你喜欢

转载自cywhoyi.iteye.com/blog/1450230