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);
  }
}
Output
Hello, world
Hello, world

本节由 Y!an 翻译