Oll*_*edt 3 linear-types hacklang
因此,Hacklang推出了一个新的,花哨的类型系统,在可以使用之前必须检查可以为空的变量.我想知道的是,你能实现类似线性类型的东西,静态强制函数调用的顺序,常见的例子是在读取之前打开文件吗?在伪代码中:
$file_handler = get_file_handler("myfile");
$file_handler->open();
$string = $file_handler->read();
Run Code Online (Sandbox Code Playgroud)
现在,$file_handler->read()不用open()抛出运行时异常,而不是编译:
$file_handler = get_file_handler("myfile");
$string = $file_handler->read(); /* Won't compile, must run open() first */
Run Code Online (Sandbox Code Playgroud)
可行?
(好吧,也许是PHP/Hacklang的不好的例子,因为它不是这个低级别,但你明白了.)
Hack目前对线性类型没有任何原生支持.对于您所询问的特定情况,opaque类型别名在包装器类中可能很有用:(危险,代码直接键入浏览器,可能有轻微错误,但应说明想法)
<?hh
newtype closedfile = resource;
newtype openfile = resource;
function get_file_handler(string $filename): closedfile {
return some_wrapped_function($filename);
}
function open_file_handler(closedfile $file): openfile {
$file->open();
return $file;
}
function read(openfile $file): string {
return $file->read();
}
Run Code Online (Sandbox Code Playgroud)
根据您的应用程序,这样做可能是不可能的,甚至不是一个好主意,但它最接近我们现在所拥有的.
也就是说,如果你正在设计API而不是使用现有的东西,那么设计它可能是一个好主意,这样就不会有一个尚未打开的文件,消除了这种错误从一开始就没有必要的任何类型系统杂技.(基本上,在我看来,至少,这是一个API设计问题,而不是类型系统问题!即使您可以使用类型系统静态地使无效代码成为错误,API的使用者甚至可以写出代码并认为它的潜在意义是API的缺陷.)
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |