Getting Started: Input And Output
输入/输出
输入和输出是 Hack 开发中的活跃领域,本页面介绍了一个标准 API 提议,及其在 hsl-experimental 中被称为 “HSL IO” 的原型。
目前不建议在CLI服务器模式下使用 HSL IO: 因为错误处理基于 C 变量 errno
,在 CLI 服务器模式下具有不可预测的行为。
HSL IO 在两个特别重要的方面与大多数其他语言的标准 IO 库不同:
- 通过类型系统而不是运行时检查来提供尽可能多的安全性。例如,以只读方式打开的文件的类型和以只写方式打开的文件的类型不同;以读写方式打开的文件的类型是“只读”和“只写”的超类型。
- 主要为异步 IO 设计,阻塞操作通常不公开。
更多的设计理念包括:
- 内部保持一致
- 减少终端用户的代码量。例如,当调用遇到
EAGAIN
的时候自动重试 - 用最显而易见的形式来使代码尽可能安全
- (支持)所有合理的行为,哪怕是不安全的
- 为常见的场景提供便利,但不以一致性和安全性作为代价
更详细的概述,请查阅 IO\Handle
的文档。基本的操作包括:
namespace Hack\GettingStarted\HSLIO;
use namespace HH\Lib\{File, IO};
<<__EntryPoint>>
async function main_async(): Awaitable<void> {
// STDIN for CLI, or HTTP POST data
$_in = IO\request_input();
// STDOUT for CLI, or HTTP response
$out = IO\request_output();
$message = "Hello, world\n";
await $out->writeAsync($message);
// copy to a temporary file, automatically closed at scope exit
await using ($f = File\temporary_file()) {
await $f->writeAsync($message);
await $f->seekAsync(0);
$content = await $f->readAsync();
await $out->writeAsync($content);
}
}
Hello, world
Hello, world
本节由 Y!an 翻译