在Groovy中使用with()进行多次分配

时间:2016-01-13 16:06:09

标签: groovy

使用使用在groovy中看到良好的工作examples

问题但是,在使用关键字 this.with {..} 的组合时,遇到问题或无法理解未提供所需输出的原因如下所示:

以下是 Person.groovy

的代码
class Person {

    def name
    def address
    def mail

    Person(name, address, mail){
        this.with {
            name = name
            address = address
            mail = mail
        }
    }

    String toString() {
        "${name} ${address} ${mail}"
    }
}

当您使用以下代码调用上述类时,输出将显示为 null null null 而不是 abc xyz abc@example.com

def person1 = new Person('abc', 'xyz', 'abc@example.com')
println person1.toString()

2 个答案:

答案 0 :(得分:2)

应该是:

class Person {

    def name
    def address
    def mail

    Person(name, address, mail){
        with {
            this.name = name
            this.address = address
            this.mail = mail
        }
    }

    String toString() {
        "${name} ${address} ${mail}"
    }
}

def person1 = new Person('abc', 'xyz', 'abc@example.com')
println person1.toString()

因为groovy不知道如何区分name与对象和传递给构造函数的name参数。

您也可以尝试:

Person(namea, addressa, maila){
    with {
        name = namea
        address = addressa
        mail = maila
    }
}

如果更改变量名称(我的意思是类字段的调用方式与构造函数args不同),则不是with也不是。

答案 1 :(得分:2)

Groovy无法将相同的标识符解析为两个不同的元素。您可以尝试使用setX代替:

class Person {
    def name
    def address
    def mail

    Person(name, address, mail){
        setName name
        setAddress address
        setMail mail
    }

    String toString() { "$name $address $mail" }
}

assert new Person('abc', 'xyz', 'abc@example.com').toString() ==
    'abc xyz abc@example.com'