山风兄弟,我猜是版本问题了,应该不是代码'变味',因为我是在eclipse里编辑,语法没有'见红',说明代码拷贝没问题.无论我在eclipse里运行,还是在命令行用groovy执行,都报一样的错,并且,我google了一下,好像这是一个bug,groovy官网上的bug report,有人已报料呢,参见:
http://jira.codehaus.org/browse/GROOVY-1933后来,我查阅了javaDOC API文档,看到最新的groovy版本 Groovy (1.1-beta-2)上的groovy.swing.SwingBuilder这个类,确实没有属性:expr(我的控制台上报错:找不到属性expr于类groovy.swing.SwingBuilder中),而你用的groovy版本中,SwingBuilder类貌似是有这个属性的.不知你的代码是工作在哪个groovy版本下?
最后,我发现一个灵异的现象,我写的另一个小程序,代码如下:
package com.airtoy.groovy.demo;
println "Nice ${cheese} Gromit!"
def cheese = "changed"
def myClosure = {println "hello $it"}('world')
执行时,报类似错误,说该类中找不到cheese属性,并且eclipse对话窗口也报那个错:
!MESSAGE An internal error occurred during: "Match Job".
!STACK 0
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
(注: -3这个在不同情况下值不同,执行你的Calculator时,是其它负值,但都系索引越界)
而我把def cheese ="changed"这一行,放在println那句前面后,执行就正确了.我就有个疑问了:难道groovy作为script执行时,语句是有顺序的吗?而不像javascript或是php那样,变量定义是全局性?(意即第一行的语句可以引用最后一行语句才定义的变量)
山风赐教.
回复 更多评论