codecamp

hack入门教程

入门

如果您是Hack的新手,该入门指南应该能够帮助您快速熟悉基础知识; 如果您还没有阅读我们对Hack的主要功能的介绍,此后,您可以深入了解有兴趣的主题,以获取更多关于Hack提供的知识。

概观

您需要编写和执行Hack代码的先决条件非常简单:

  • HHVM运行
  • The Hack typechecker (包括作为HHVM运行时构建的一部分)
  • 可选地,具有Hack感知的编辑器。我们推荐Nuclide,其一流的支持Hack。

(1)执行Hack代码(2)运行Hack类型检查器(这是使用Hack语言的基础优势)来确保您的代码写得好,安全和一致,所以HHVM运行时是必需的。

尝试我们的交互式hack教程

您可以开始学习Hack,而无需安装任何软件。只需转到交互式Hack教程,逐步了解一些Hack功能。

你的第一个hack程序

让我们在五个简单的步骤中潜入并创建您的第一个Hack程序。

1.安装HHVM和Typechecker

查看有关如何安装HHVM 的HHVM入门指南

安装HHVM后,Hack typechecker将可用于在运行代码之前静态检查代码。它不是一个编译器; 而是一个超快的代码分析器,在代码运行之前尝试捕获动态编程错误,而不是在之前或之后。

类型检查器被调用,hh_client并且在HHVM团队支持的所有官方包中都可以使用HHVM。如果您正在使用社区提供的软件包,那么hh_client很可能也是可用的,但您应该与您的软件包维护者联系。

2.为Typechecker设置

选择要存储Hack代码的目录。在这个目录下运行touch .hhconfig。这将创建一个空文件,hh_client寻找作为类型检查代码的根。为了正确分析您的代码,类型检查器需要进行全局分析,并能够查看所有代码。这意味着它为这个根目录下的任何代码假定一个全局自动装载器,并将这个根目录下的所有代码一起作为一个项目一起检查。

3.写你的第一个Hack程序

使用您选择的编辑器(例如,Nuclide,vim,Sublime Text),让我们创建一个first.php使用以下代码调用的文件:

 {
  public function __construct(private T $elem) {
  }


  public function get(): T {
    return $this->elem;
  }
}


function get_int(): int {
  return 42;
}


function use_box(): void {
  $box = new Box(get_int());
  $i = $box->get();
  var_dump($i);
}


use_box();

该入门指南假定了一些编程知识(例如,什么是类,什么是函数或方法等)。如果你熟悉PHP,Hack有着相似的外观和感觉。如果你不熟悉PHP,那么所有这一切都是新的,但希望你的一般结构是熟悉的。意见提供各种细节,但这里是要点:

  • 这个例子是创建一个class叫做Box。
  • 这个Box class是通用的。
  • 在构造函数中使用构造函数参数提升。
  • 函数参数和返回类型都使用类型注释。

4.运行Typechecker

如果您使用的是Nuclide等编辑器,则在编写程序时会看到类型检查信息。如果从命令行运行typechecker命令只是

%hh_client

你应该看到:

No errors!

现在想象如果我们将返回类型get_int()改为bool而不是int。如果你运行typechecker,你会看到这样的:

first.php:15:10,11: Invalid return type (Typing[4110])
  first.php:14:21,24: This is a bool
  first.php:15:10,11: It is incompatible with an int

这表明了Hack类型系统和类型检查器的强大功能:它可以让您知道您可能不会返回您的想法。类型检查器对所有的代码进行这些检查,而不必运行它们。

5.在HHVM中运行代码

在您得到您的Hack程序以类型检查清除没有错误后,您可以在HHVM中运行该程序。

%hhvm first.php

这里是输出:

INT(42)
hack常见问题
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }