Context:
DSL (Domain-Specific Language)领域性语言。语言依赖于context(上下文、背景),比如我去拉面馆说“老板,要宽的加个鸡蛋”,我没说是要拉面,老板也知道我的意思了。
with()方法:
JavaScript和VBScript都有with这个特性,支持创建上下文,with作用域内的方法都指向上下文对象。
lst = [1,2] lst.add(3) lst.add(4) println list.size() println list.contains(2)等价于:
lst = [1,2] lst.with{ add(3) add(4) println size() println continas(2) }而括号、类型在Groovy中几乎总是可选,所以进一步简化:
lst = [1,2] lst.with{ add 3 add 4 println size println continas(2) }
Groovy拓展:
机制是 调用with方法时,会把闭包的delegate属性设置到 lst 这个对象上。
with是Groovy在Object这个基类上的扩展,除了with还有dump,inspect,sleep。dump可以到处hash、属性(类似于 toString,方法);inspect用于说明创建一个对象需要提供什么,如果没实现则返回toString()的内容;sleep传一个闭包,通过返回值来决定是抑制InterruptedException。还有动态获取属性、调用方法,car.name访问那么属性,动态使用[]操作符,映射到getAt方法,如果位于赋值符左侧则是putAt。代码如下:
class car{ int miles,fuleLevel } car = new Car(fulLevel: 80,miles: 25) properties = ['miles','fuelLevel'] properties.each{ name -> println "$name = ${car[name]}" } car[properties[1]] = 100 //same as set method
调用方法是invoke()方法
peter = new Person() peter.invokeMethod("methodName",null) peter.invokeMethod("methodName2",10) peter.invokeMethod("methodName3",[2,'uphill'] as Object[])
还有如File的:
new File("path").text //直接显示文件内容 newFile("path").eachLine{ line -> println line } new File('path').filterLine{ it =~ /life/ } new File('path').withWriter{ file -> file >> "some data..." }
当然也可以自定义扩展(在Groovy2.x),通过拓展类、Manifest写,然后加入Classpath中运行。
创建DSL:
Integer.MetaClass{
getDays = { ->
delegate
}
getAgo = { ->
def date = Calendar.instance
date.add(Calendar.DAY_OF_MONTH,-delegate)
date
}
}
Cladendar.MetaClass.at = { Map time ->
def hour = 0
def minute = 0;
time.each{key,value ->
hour = key.toInteger()
minute = value.toInteger()
}
delegate.set(Calendar.HOR_OF_DAY,hour)
delegate.set(Calendar.MINUTE,minute)
delegate.set(Calendar.SECOND,0)
delegate.time
}
println 2.days.age.at(4:30)
//Fri Feb 03 04:30:00 MST 2012
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。