【问题标题】:Groovy usage of named arguments命名参数的 Groovy 用法
【发布时间】:2013-05-23 23:11:52
【问题描述】:

我有一个像这样的 groovy 方法

def createMyObj(id,instanceId,isValid) {

   def myObj = new SomeObj()
   myObj.setId(id)
   myObj.setInstanceId(instanceId)
   myObj.isValid(isValid)

   myObj

}

当我在测试中明确执行此操作时,我对此进行了测试,它工作得非常好。

def testObj = createMyObj(10,20,true)

当我尝试使用这样的命名参数时。

def testObj = createMyObj(id:10,instanceId:20,isValid:true)

它给了我这个例外

 No signature of method:createMyObj is applicable for argument types: (java.util.LinkedHashMap) values [[id:10, instanceId:20,..]]

我去了page进一步了解这个概念,我看到了这篇sn-p。

def foo(T t, p1, p2, ..., pn) 的情况下,所有命名参数都将在 t 中,但这也意味着您不能在通过名称访问 pi 的地方进行方法调用。示例

def foo(x,y){}
foo(x:1,y:2)

此代码将在运行时失败,因为方法 foo 需要两个参数,但您提供的映射只有一个参数。

我不确定这是否是我所面临错误的原因。如果它需要两个参数,就像它说我缺少的参数是什么或者我如何传递第二个参数?

【问题讨论】:

    标签: groovy


    【解决方案1】:

    使用这样的命名参数调用函数:

    def testObj = createMyObj(id:10,instanceId:20,isValid:true)
    

    表示您只向函数传递了一个参数[id:10,instanceId:20,isValid:true],即LinkedHashMap

    显然,createMyObj(id, instanceId, isValid) 需要 3 个参数。所以你得到这个异常也没关系:

    No signature of method:createMyObj is applicable for argument types: (java.util.LinkedHashMap) values [[id:10, instanceId:20,..]]
    

    对于后一种情况:

    def foo(x,y){}
    foo(x:1,y:2)
    

    为了传递第二个参数,您只需要在调用时再添加一个参数,如下所示:

    def foo(x,y){}
    foo(x:1,y:2,"newParameter")
    

    在这种情况下foo 得到

    • x as [x:1, y:2](即LinkedHashMap
    • y"newParameter"

    【讨论】:

    • 感谢您的回答。那么我该如何解决这个问题,以便我可以使用命名参数?我也不明白你的意思是可以得到这个例外:)
    • nvm 让它工作。调整了功能,只拍一张地图,效果很好。
    • 是的,如果在定义中将函数参数更改为 Map、[] 或 Object...,它会起作用。
    猜你喜欢
    • 2011-11-16
    • 2014-07-31
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2013-08-02
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多