• Groovy小记it关键字和IDE报错


    在工作中经常写Groovy脚本,由于GroovyJava的亲戚关系,所以也就直接在Intellij IDEA工具上写了,一是因为方便,二是也找不到其他工具了。

    但是在使用的过程中总会遇到一些兼容性的问题。Intellij IDEA对于Groovy的支持并不完美,大概也是Groovy语言特性过多的原因。我下载了一个Groovy检查的插件,依然还有漏网之鱼。下面分享一些大大小小的,以方便后来之人。

    IDE报错

    在使用Groovy语法特性的时候,经常会遇到标红和报错,但是Intellij IDEA依然会允许程序运行。但是在运行中可能会遇到错误,还得返回来检查,甚至有时候IDE还不会提示这个错误。所以我在写Groovy脚本时候,之前是更多偏重于用Java的语法。最近改变了自己的习惯之后,发现有一部分IDE报错其实没有问题的。例如下面的两个例子:

    获取属性

    Groovy获取属性有三种写法。

    user.name
    user["name"]
    user.getName()
    

    对的,你没有看错,第一个写法和第三个写法在Groovy里面包含了不同的含义,因为Groovy正常情况下没有getName()这个方法。至于第二种写法算是特殊的语法。

    上面三个语法不仅是针对User对象,对于JSonobject依然适用,我在使用JsonPath工具实践的时候也经常用到。有兴趣可以参考以下文章:

    但是第二种写法在Intellij IDEA里面就会被标红,提示出错。

    泛型方法调用

    这是是我在做性能测试的过程中遇到的,我在ThreadBase<T>定义了一个对象 public T t;,最开始的想法是用来处理线程私有数据对象的,但是后来发现其实直接新建类比较合适,就用的不多了。

    有兴趣的可以参考以前的文章:

    先发一个第一种写法,也是我现在最常用的写法。

        static class TT extends ThreadLimitTimesCount {
    
            Mirro m
    
            int aid = 0
    
            public TT(Mirro mirro, int times) {
                super()
                this.m = mirro
                this.times = times
            }
    
            @Override
            protected void doing() throws Exception {
                def pre = m.createPre()
                if (aid == 0) {
                    aid = pre.getJSONObject("data").getIntValue("activity_id")
                }
                m.delPre(aid)
            }
        }
    

    再发一下之前的写法。

        static class TT extends ThreadLimitTimesCount {
    
            int aid = 0
    
            public TT(Mirro mirro, int times) {
                super()
                this.t = mirro
                this.times = times
            }
    
            @Override
            protected void doing() throws Exception {
                def pre = m.createPre()
                if (aid == 0) {
                    aid = pre.getJSONObject("data").getIntValue("activity_id")
                }
                t.delPre(aid)
            }
        }
    

    已经取消了Mirro这个属性,但是在最后会有报错,如图:

    这种情况还会出现在def修饰的对象调用方法获取属性的时候,这个时候就需要微微一笑由他去吧

    it关键字

    Groovy语言中循环中,it关键非常有用,比如遍历一个String数组或者集合对象的话,直接用it就可以代表遍历到的String对象。举个例子:

            5.times {
                output(it)
            }
    

    控制台输出:

    INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.6
    INFO-> 0
    INFO-> 1
    INFO-> 2
    INFO-> 3
    INFO-> 4
    
    Process finished with exit code 0
    

    今天遇到一个双层遍历的问题,突然发现不知道在双层遍历的情况下it关键字是否可以通用,也就是在外层遍历时候使用it,然后在内层遍历时候也用it,两个it表示不同的遍历对象。下面我们验证一下:

            3.times {
                output(it * 10)
                3.upto(5) {
                    output(it)
                }
            }
    

    控制台输出:

    
    INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.6
    INFO-> 0
    INFO-> 3
    INFO-> 4
    INFO-> 5
    INFO-> 10
    INFO-> 3
    INFO-> 4
    INFO-> 5
    INFO-> 20
    INFO-> 3
    INFO-> 4
    INFO-> 5
    
    Process finished with exit code 0
    
    

    果然完美解决我的疑惑,不得不钦佩Groovy的设计者。


    公众号FunTester首发,原创分享爱好者,腾讯云和掘金社区首页推荐,知乎七级原创作者,欢迎关注、交流,禁止第三方擅自转载。

    FunTester热文精选

  • 相关阅读:
    wenbao与powershell
    wenbao与windows
    wenbao与msf
    CCF201612-Python题解
    语不惊人死不休
    为人性僻耽佳句(一)
    Pytorch出现 raise NotImplementedError
    CNN卷积
    python字符串切片
    python----numpy(持续更新)
  • 原文地址:https://www.cnblogs.com/FunTester/p/13694756.html
Copyright © 2020-2023  润新知