首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在groovy shell中使用groovy类别

在groovy shell中使用groovy类别
EN

Stack Overflow用户
提问于 2014-05-27 16:39:12
回答 1查看 228关注 0票数 5

我正在使用Groovy类别在一些DSL下工作,我希望找到一种方法,在groovy中使用我的DSL,而无需为每个命令显式地编写use(MyCategory){ myObject.doSomething() }

例如,假设我有以下玩具类别:

代码语言:javascript
复制
class MyCategory {
    static Integer plus(Integer integer, String string){
        return integer + Integer.valueOf(string)
    }
}

然后,我可以通过以下方式在groovysh中使用这个类别:

代码语言:javascript
复制
groovy> use(MyCategory){ 2 + '3' } //gives 5

那么,是否有任何方法可以为所有MyCategory命令全局设置groovysh,所以不必每次在use(MyCategory) { ... }中包装我的命令?例如:

代码语言:javascript
复制
groovy> useGlobally(MyCategory); //call something like this only once
groovy> 2 + '3' //automatically uses MyCategory and gives 5
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 16:49:09

这个类别的思想是关闭元编程的范围。为什么不在这种情况下使用metaClass呢?

代码语言:javascript
复制
groovy:000> class MyCategory {
groovy:001>     static Integer plus(Integer integer, String string){
groovy:002>         return integer + Integer.valueOf(string)
groovy:003>     }
groovy:004> }
===> true
groovy:000> Integer.metaClass.mixin MyCategory
===> null
groovy:MyCategory@131fa4b> 2 + '4'
===> 6
groovy:MyCategory@131fa4b> 

Update:使用许多方法,您可以迭代静态方法的第一个参数,并将它们混合到相应的参数类型类中。

代码语言:javascript
复制
class MyCategory {
    static global() {
        MyCategory.metaClass.methods
            .findAll { it.isStatic() && !it.name.startsWith("__") && it.name != "global" }
            .each { it.nativeParameterTypes[0].mixin MyCategory }
    }

    static Integer plus(Integer integer, String string){
        return integer + Integer.valueOf(string)
    }

    static String yell(String a, times) {
      a.toUpperCase() * times + "!!!"
    }
}


MyCategory.global()


assert "a".yell(3) == "AAA!!!"
assert 2+'3' == 5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23894653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档