- 浏览: 106266 次
- 性别:
- 来自: 上海
最新评论
-
toby941:
有办法不使用这种DGM机制么
Groovy深入探索——DGM调用优化 -
JohnnyJian:
joeytang 写道c = { -> println ...
Groovy学习笔记——在Groovy中调用Groovy脚本 -
joeytang:
c = { -> println a * 3 }
这 ...
Groovy学习笔记——在Groovy中调用Groovy脚本 -
JohnnyJian:
k不是什么下标,详细的话你还是看我另外一篇blog吧:http ...
Groovy学习笔记——用inject方法构造Map -
key232323:
汗。。。二维List原来也可以each{k, v这么用。。。
Groovy学习笔记——用inject方法构造Map
文章列表
之前Evan在http://www.chinagroovy.org/forum/index.php?topic=291.0中问了关于如何调用一个外部的Groovy脚本中的闭包的问题,实际上这并不复杂,要比Java调用Groovy的方法简单。
譬如我们有这样的脚本:
// com/test/SomeScript.groovy
package com.test
println a
b = a * 2
c = { -> println a * 3 }
我们可以这样子调用这个脚本(不需要把SomeScript.groovy编译为class文件,当然编译也是可以的):
// ...
假设我们有这样的代码:
class Test {
def fun1() { println 'a' }
def fun2() { println 'b' }
def fun3() { println 'c' }
}
def test = new Test()
test.fun1()
test.fun2()
test.fun3()
我们可以通过Object上的with方法省去test对象的限定:
test.with {
it.fun1()
it.fun2()
it.fun3()
}
// 或者连it也省去
te ...
Getris是由本人发起的开源项目,它是一个用Groovy编写的俄罗斯方块游戏。
Getris的目的是向初学者演示Groovy的各种特征,这些特征包括:
Closure
Groovy Bean
MetaClass
Mixin (使用关键字'use')
SwingBuilder
MarkupBuilder (用于创建XML)
XmlSlurper (用于解析XML)
GAnt
单元测试工具, 如MockFor类
等等……
项目地址:http://code.google.com/p/getris/
欢迎大家加入!
请看如下代码:
def a = 'b'
def m = [a:a]
println m // 输出[a:b]
输出的是[a:b]而不是[b:b],这是因为Groovy把Map的key都当作字符串处理了,即使没有加上单引号或者双引号。所以这里Map的key“a”并不是看作变量a,而是字符串"a"。
要让这里的a被看作变量,需要加上圆括号或者使用GString,如下所示:
m = [(a):'a']
println m // 输出[b:a]
m = ["$a":a]
println m // 输出[b:b]
代码如下:
def out = System.out // 也可以用import static System.out as out
def endl = '\n'
out << 'a' << ' ' << 'b' << endl
out << 1 << endl
out << 'abcdefg' << endl
这段代码可能没有什么实用价值,顶多只能展现一下Groovy的能力而已。
在写程序的时候,可能需要用到0到n-1的循环,一般的写法是:
for (i = 0; i < 5; ++i) {
println i
}
或者更Groovy的写法:
for (i in 0..<5) {
println i
}
但是其实可以使用int类型上的times方法:
5.times { println 'Yes' }
5.times { println it } // 输出“0 1 2 3 4”而不是“1 2 3 4 5”
5.times { i ->
println i
}
但是用times方法来做0到n-1的循环可能会影响语义 ...
今天写了个读取类的函数的签名的脚本,供学习之用,其实最主要是想看看Groovy都给类添加了些什么函数。
代码就二十多行,从中又可以体现出Groovy代码之精炼
PrintClass.groovy:
if (args) {
def className = args[0]
def theClass = Class.forName(className)
def theMetaClass = theClass.metaClass
def printClass = { property ->
println "The $prop ...
在Groovy中,as操作符有两种用途:定义导入别名和类型转换。
1. 定义导入别名
只要在import一个类或方法的时候使用as操作符,就可以对其进行重命名:
import java.lang.Math as M // 定义类的别名
assert M.log10(100) == 2
import static M.log10 as log // 定义方法的别名
assert log(1000) == 3
2. 类型转换
语法为“变量 as 类型”,在执行这个操作时,将调用左操作数的类的asType方法:
class A {
def val
def asTy ...
利用Groovy的动态特性,不但可以给类添加属性(http://www.blogjava.net/BlueSUN/archive/2007/07/15/130318.html),还可以删除类的属性。
代码如下:
class A {
String attToRemove
int otherAtt
}
def a = new A()
a.attToRemove = 1
println a.attToRemove
A.metaClass.properties.remove(A.metaClass.properties.attToRemove)
println a ...