【问题标题】:What happen's to a closure's delegate when it gets cloned?当一个闭包委托被克隆时会发生什么?
【发布时间】:2014-11-25 00:08:46
【问题描述】:

当一个代理在一个闭包中发生变化时,在 Groovy 中,当该闭包被克隆时会发生什么?

委托设置是否存在?

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    委托设置是否存在?

    如果“生存”是指克隆将拥有相同的委托,那么答案是“是”。

    groovy:000> c = {
    groovy:001>     append 'Hello'
    groovy:002> }
    ===> groovysh_evaluate$_run_closure1@31e033f0
    groovy:000> 
    groovy:000> c.delegate = new StringBuffer()
    ===> 
    groovy:000> d = c.clone()
    ===> groovysh_evaluate$_run_closure1@7970c11a
    groovy:000> 
    groovy:000> c.delegate
    ===> 
    groovy:000> d.delegate
    ===> 
    groovy:000> c()
    ===> Hello
    groovy:000> c.delegate
    ===> Hello
    groovy:000> d.delegate
    ===> Hello
    groovy:000> d.delegate.append 'Goodbye'
    ===> HelloGoodbye
    groovy:000> c.delegate
    ===> HelloGoodbye
    groovy:000> d.delegate
    ===> HelloGoodbye
    groovy:000> 
    

    根据具体情况,如果您编写一个接受闭包的方法并且您的方法将修改闭包的状态(如修改委托或 resolveStrategy),那么正常的做法通常是克隆闭包,然后只改变克隆上的那些属性,使原始的属性保持原样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2011-08-17
      • 2017-03-24
      • 2023-03-25
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多