gpt4 book ai didi

groovy - 关于闭包和常规构建器模式

转载 作者:行者123 更新时间:2023-12-02 13:54:50 25 4
gpt4 key购买 nike

开始掌握一般的闭包和一些常规功能。

给出以下代码:

class Mailer {
void to(final String to) { println "to $to" }
void from(final String from) { println "from $from" }

static void send(Closure configuration) {
Mailer mailer = new Mailer()
mailer.with configuration
}
}

class MailSender {
static void sendMessage() {
Mailer.send {
to 'them'
from 'me'
}
}
}

MailSender.sendMessage()

当您将闭包传递给 Mailer.send 方法时,幕后会发生什么?

从闭包的角度来看,tofrom 是否作为参数传递?闭包映射了哪些类型?

然后在 Mailer 对象调用 mailer.with 接收 configuration 对象时,在 Mailer.send 方法中,对象映射它们进入方法调用。 Groovy 通过反射来做到这一点?

最佳答案

Groovy 可以动态 define the delegate闭包甚至 this 对象。

with 正在设置委托(delegate)并执行闭包。这是实现相同目的的详细方法:

def math = {
given 4
sum 5
print
}


class PrintMath {
def initial
def given(val) {
initial = val
}

def sum(val) {
initial += val
}

def getPrint() {
println initial
return initial
}
}

math.delegate = new PrintMath()
math.resolveStrategy = Closure.DELEGATE_ONLY

assert math() == 9
<小时/>

What happens under the hood when you pass a closure to Mailer.send method?

它接收一个尚未执行的代码块。

Does to and from are passed as arguments from the Closure point of view?

不,最好将它们视为 java 中的匿名类/lambda,或 javascript 中的 function(){}

Which types the Closure maps them?

无,它们是等待执行的方法调用。不过,它们可以委托(delegate)给不同的对象。

And then inside the Mailer.send method at the moment the Mailer object calls mailer.with receiving the configuration object, the object maps them into method calls. Groovy does this by reflection?

您可以decompile a Groovy class file看看发生了什么。 IIRC,Groovy 目前使用“reflector”策略(带有 arrayOfCallSite 缓存)来使调用更快,或者它可以使用 invokedynamic

上面代码中的闭包math将生成此类:

// .. a lot of techno-babble

public Object doCall(Object it) {
CallSite[] arrayOfCallSite = $getCallSiteArray();
arrayOfCallSite[0].callCurrent(this, Integer.valueOf(4));
arrayOfCallSite[1].callCurrent(this, Integer.valueOf(5));
return arrayOfCallSite[2].callGroovyObjectGetProperty(this);
return null;
}

关于groovy - 关于闭包和常规构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31568432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com