def关键字如何在Groovy中运行?

时间:2013-08-14 06:16:11

标签: groovy

代码 -

class Parser {
 def parseName(String name) {
   if (name.contains(',')) {
     parts = name.split(',')
   }
 }
}
p = new Parser()
p.parseName('kshitiz,sharma')

例外 -

groovy.lang.MissingPropertyException: No such property: parts for class: Parser
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at

以下是上述脚本的AST -

p = new Parser()
p.parseName('kshitiz,sharma')
public class script1376460726356 extends groovy.lang.Script { 
    public script1376460726356() {
    }
    public script1376460726356(groovy.lang.Binding context) {
        super.setBinding(context)
    }
    public static void main(java.lang.String[] args) {
        org.codehaus.groovy.runtime.InvokerHelper.runScript(script1376460726356, args)
    }
    public java.lang.Object run() {
        p = new Parser()
        p.parseName('kshitiz,sharma')
    }
}
public class Parser extends java.lang.Object { 
    public java.lang.Object parseName(java.lang.String name) {
        if (name.contains(',')) {
            parts = name.split(',')
        }
    }
}

问题 -

  1. 为什么parts出现错误而p没有错误?我没有看到p被定义,甚至没有被script binding放置和访问?它只是直接用于方法run()
  2. p = new Parser()在顶部做什么?在Java中,不应该将所有内容都放在一个全局变量只是幻觉的类中吗?
  3. 这是否意味着def关键字仅在独立脚本中是可选的,而不是在用户定义的类中?

1 个答案:

答案 0 :(得分:3)

我认为这总结得很好:

Scoping and the Semantics of def

简而言之,如果没有定义,那么它就是绑定(但这仅适用于脚本),并且脚本是唯一允许在使用之前不指定变量的地方。