У меня есть интерфейс, который выглядит так.Как написать общий тип функции
interface Value {
public function accept<T>(ValueVisitor<T> $visitor): T;
}
Поскольку существует только один метод, я хочу написать класс, который преобразует замыкание в экземпляр Value
.
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);
}
}
Однако <T>
в типе function<T>(ValueVisitor<T>): T
является синтаксической ошибкой. Независимо от того, где я положил <T>
, он не будет анализировать.
Как я могу написать это в Hack?
Простите мое отсутствие воображения, но что ваше общее закрытие '$ f' даже сделать, так как он не может захватить' T' типизированных значений из его окружения? Как это полезно для использования с ValueVisitor '? –
concat
'ValueVisitor' имеет методы, которые возвращают 'T', поэтому функция '(функция (ValueVisitor ): T)' должен возвращать 'T', и единственное, что он должен сделать, это вызвать методы 'ValueVisitor ', предоставленный ему. –
Jesse
Мне любопытно, сколько разных комбинаций вызовов методов вы намереваетесь делать на 'ValueVisitor', но в целом это кажется разумным. Ваш лучший выбор - это, вероятно, запрос на функцию команды Hack. (Лично я тоже надеюсь, что анонимные классы в конечном итоге будут реализованы, что тоже может помочь вам здесь) – concat