【发布时间】:2016-08-04 15:12:14
【问题描述】:
我有一个类似这样的界面。
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);
}
}
但是,function<T>(ValueVisitor<T>): T 类型中的 <T> 是语法错误。不管我把<T>放在哪里,它都不会解析。
如何在 Hack 中编写这个?
【问题讨论】:
-
请原谅我缺乏想象力,但是您的通用闭包
$f甚至可以做什么,因为它无法从其环境中捕获T类型的值?它如何与ValueVisitor<T>有效交互? -
ValueVisitor<T>具有返回Ts 的方法,因此函数(function <T>(ValueVisitor<T>) :T)必须返回T并且它必须这样做的唯一方法是调用ValueVisitor<T>的方法给它。 -
我很好奇您打算在
ValueVisitor上进行多少种不同的方法调用组合,但总的来说这似乎是合理的。您最好的选择可能是向 Hack 团队提出功能请求。 (就我个人而言,我也希望最终实现匿名类,这也可以帮助你) -
是的,这是匿名泛型函数github.com/facebook/hhvm/issues/7451 和匿名类github.com/facebook/hhvm/issues/6039 的问题。
标签: generics anonymous-function hacklang