[Groovy] 从java过渡groovy

suifongqi 2009-11-13
groovy本其官方形容成JVM上的天使语言,确实也挺不错,开发起来也挺方便。而且从java过度groovy也很快。下面来谈谈我过渡这段时间遇到的问题吧。。。

首先选择合适的开发工具:eclipse虽然方便,但插件版本实在难把握,更新了几个groovy的插件都没法使。所以。。我用了intellij8

首先我创建了一个groovy script,代码如下:

tmp = 10
println(tmp)
tmp = "abc"
println(tmp)
//*************对比下面代码********************
def tmp = 10
println tmp
def tmp = "abc"
println tmp


第一部分代码打印结果是10和abc;第二部分代码编译不过,因为重复定义了变量名tmp
疑问
1 资料上说定义变量需要使用def关键字,但是第一部分代码,我没定义还不是照样用
那么用与不用def定义有什么区别吗?
嘿嘿,我想聪明人这时会用反编译器去了。先卖个关子这里我先不提。继续看代码

//设想方法定义前能否省略掉def
a()//能编译过吗?
{
}
def a()
{
}

遗憾的是方法必须得使用def。继续往下
//注意该代码写在groovy script中,非groovy类中

   def c =10;
   def a()
 {
   println(c)
 }
 a()
//**********对比如下代码**************************
   c =10;
   def a()
 {
   println(c)
 }
 a()

在不看运行结果前,根据之前的实验用与不用def声明定义变量效果都一样.
运行代码....
吃惊的发现第一部分代码运行不过,无法打印;第二部分代码输出10
第一部分代码报错提示如下:
Caught: groovy.lang.MissingPropertyException: No such property: c for class: s1
在不去看反编译结果前,我继续做了下面的测试

def a()
 {
   def c=10
   println(c)
 }
 a()

//***************对比******************

def a()
 {
   c=10
   println(c)
 }
 a()
//**************对比*****************
def a()
 {
   int c=10
   println(c)
 }
 a()

运行发现:以上结果打印10.。。。呵呵继续往下,再次提醒以上代码都是在groovy script文件中编写,并非类里。

通过反编译器大致可以得出如下结论:在方法a()外用def定义的变量c,其作用范围是在run方法中,而run方法与a方法平级,方法a当然就不能调用.至于不用def在外定义可用,大家下来研究研究。



下面创建一个groovy的class,在里面做一些实验

public class c1 {

  def r = 1000;
  def a()
  {
      def r="abc"
      println(r)
  }
public static void main(String[] args)
{
    def cc1 = new c1()//能否换成cc1 = new c1()或者 c1 cc1 = new c1()?
    cc1.a()
    println(cc1.getR())
}

}


考虑:代码能否编译?是否出现重命名的问题?如果可以运行println(r)的结果应该是多少?考虑主函数中的代码替换问题。
结果是:运行正确,打印abc,1000
主函数当中的代码能做替换吗?
能把def r="abc"换成 String r="abc"吗?
今天就先这些吧,避免把大家搞晕了








helian 2009-11-15


script里不用def的话是binding variable, 可以被你在script里定义的方法直接引用。
用def的话是local variable,跟script里定义的方法不是一个scope的,就好象在main方法里定义的变量不能被其他方法引用一样。

清风车影 2009-11-17
有空可以交流一下,我公司用grails一年多了.感觉还不错,有一点比较烦的就是,出了问题有时候不怎么办.查资料都没法查.groovy grails在国内用得非常少.
helian 2009-11-17
清风车影 写道
有空可以交流一下,我公司用grails一年多了.感觉还不错,有一点比较烦的就是,出了问题有时候不怎么办.查资料都没法查.groovy grails在国内用得非常少.


英文过得去的话去社区的mail list问吧
Global site tag (gtag.js) - Google Analytics