Ich habe eine Schnittstelle, die so aussieht.Wie generische Funktion schreiben
interface Value {
public function accept<T>(ValueVisitor<T> $visitor): T;
}
Da es nur eine Methode ist, möchte ich eine Klasse schreiben, die einen Verschluss in eine Instanz von Value
umwandelt.
final class ClosureValue implements Value {
public function __construct(
private (function<T>(ValueVisitor<T>): T) $f
) {}
public function accept<T>(ValueVisitor<T> $visitor): T {
$f = $this->f;
return $f($visitor);
}
}
jedoch die <T>
in der Art function<T>(ValueVisitor<T>): T
ist ein Syntaxfehler. Egal wo ich die <T>
setze, wird es nicht analysieren.
Wie kann ich das in Hack schreiben?
Verzeihen Sie meinen Mangel an Vorstellungskraft, aber was kann Ihre generische Schließung '$ f' sogar tun, da es' T'-typisierte Werte von seiner Umgebung nicht erfassen kann? Wie interagiert es sinnvollerweise mit ValueVisitor? –
concat
'ValueVisitor' hat Methoden, die 'T's zurückgeben, so eine Funktion' (Funktion (ValueVisitor ):) muss ein 'T' zurückgeben und das einzige Mittel, das es zu tun hat, ist, Methoden des zu benennen 'ValueVisitor ' gegeben. –
Jesse
Ich bin gespannt, wie viele verschiedene Kombinationen von Methodenaufrufen Sie auf "ValueVisitor" machen möchten, aber im Allgemeinen erscheint das vernünftig. Ihre beste Wette ist wahrscheinlich eine Feature-Anfrage an das Hack-Team. (Persönlich hoffe ich auch, dass anonyme Klassen eventuell implementiert werden, was Ihnen auch hier helfen könnte) – concat