如何合并多个Func <>委托

问题描述

如何合并多个Func委托?

假设我有两个代表

Func<bool> MovementButtonHold() => () => _inputSystem.MoveButtonHold
Func<bool> IsFreeAhead() => () => _TPG.IsFreeAhead();

有什么办法可以将这两个代表合并为一个Func<bool>代表?

类似的东西:

Func<bool> delegate1 = MovementButtonHold() && IsFreeAhead();

Func<bool> delegate2 = MovementButtonHold() || IsFreeAhead();

解决方法

在您的代码中,MovementButtonHold和IsFreeAhead不是委托,它们是返回委托的方法。 因此,将它们结合起来需要这样的东西:

from dolphin import controller,event

while True:
    await event.frameadvance()
    buttons = controller.get_gc()
    buttons["A"] = True
    controller.set_gc(buttons)
    await event.frameadvance()
    # do nothing every other frame

请注意上面的()()怪异语法。第一个()是调用方法并返回委托,第二个()是调用委托以返回布尔值。然后,创建一个内联函数以对输出执行“ AND”或“ OR”运算,并将该内联函数分配给委托1或委托2

除非您有理由让MovementButtonHold和IsFreeAhead返回委托,否则可以按如下方式简化其实现,以简单地返回布尔结果。

Func<bool> delegate1 = () => MovementButtonHold()() && IsFreeAhead()();
Func<bool> delegate2 = () => MovementButtonHold()() || IsFreeAhead()();
,
    Func<bool> MovementButtonHold = () => true;
    Func<bool> IsFreeAhead = () => false;
    
    Func<bool> delegate1 = () => MovementButtonHold() && IsFreeAhead();
    Func<bool> delegate2 = () => MovementButtonHold() || IsFreeAhead();