• Hack语言类型化简介


    在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石。开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析。
    这是用于对比Hack特性的一个实例,用传统PHP形式编写:

    <?php
    
    namespace HackUserDocumentationTypesIntroExamplesPreHack;
    
    class Z {}
    class A {
      public $a;
      public $b;
    
      public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
      }
    
      public function foo($x, $y) {
        return $x * $this->a + $y * $this->b;
      }
    }
    
    function bar(A $a, $x, $y) {
      return $a->foo($x, $y);
    }
    
    function baz() {
      $a = new A(2, 4);
      $z = new Z();
      var_dump(bar($a, 9, 4));
      // Did we really want to allow passing a stringy int?
      var_dump(bar($a, 8, "3"));
      // Did we really want to allow passing booleans?
      var_dump(bar($a, true, false));
      // This will throw a fatal at runtime
      var_dump(bar($z, 1, 1));
    }
    
    baz();
    Output
    int(34)
    int(28)
    int(2)
    
    Catchable fatal error: Argument 1 passed to HackUserDocumentationTypesIntroExamplesPreHackar() must be an instance of HackUserDocumentationTypesIntroExamplesPreHackA, HackUserDocumentationTypesIntroExamplesPreHack given in /data/users/joelm/user-documentation/guides/hack/20-types/01-introduction-examples/pre-hack.php on line 22
    

    上述示例可以完美运行于HHVM上(除了在最后的var_dump处发生一个致命错误)。尽管如此,在很多方面它没有清晰的表达出开发者的意图。比如,开发者是否允许A::foo()接受字符串类型的int值。当然,习惯上的处理方式,如通过is_int()函数来检测或抛出异常可以缓解这种情况。

    但是你看看下面的例子,开发者的意图是否更清晰:

    <?hh
    
    namespace HackUserDocumentationTypesIntroExamplesHack;
    
    class Z {}
    class A {
      public int $a;
      public int $b;
    
      public function __construct(int $a, int $b) {
        $this->a = $a;
        $this->b = $b;
      }
    
      public function foo(int $x, int $y): int {
        return $x * $this->a + $y * $this->b;
      }
    }
    
    function bar(A $a, int $x, int $y): int {
      return $a->foo($x, $y);
    }
    
    function baz(): void {
      $a = new A(2, 4);
      $z = new Z();
      var_dump(bar($a, 9, 4));
      // Did we really want to allow passing a stringy int? NO!
      // The typechecker will actually error here before you even run the program,
      // so you can catch problems before runtime.
      var_dump(bar($a, 8, "3"));
    
      // Did we really want to allow passing booleans? NO!
      // The typechecker will error here too.
      var_dump(bar($a, true, false));
    
      // This will throw a fatal at runtime
      // The typechecker will error here as well
      var_dump(bar($z, 1, 1));
    }
    
    baz();
    
    /****
    
    Type checker errors:
    
    hack.php:29:23,25: Invalid argument (Typing[4110])
      hack.php:20:28,30: This is an int
      hack.php:29:23,25: It is incompatible with a string
    hack.php:31:20,23: Invalid argument (Typing[4110])
      hack.php:20:20,22: This is an int
      hack.php:31:20,23: It is incompatible with a bool
    hack.php:31:26,30: Invalid argument (Typing[4110])
      hack.php:20:28,30: This is an int
      hack.php:31:26,30: It is incompatible with a bool
    hack.php:33:16,17: Invalid argument (Typing[4110])
      hack.php:20:14,14: This is an object of type
                         HackUserDocumentationTypesIntroExamplesHackA
      hack.php:26:8,14: It is incompatible with an object of type
                        HackUserDocumentationTypesIntroExamplesHack
    *****/
    Output
    int(34)
    
    Catchable fatal error: Argument 3 passed to HackUserDocumentationTypesIntroExamplesHackar() must be an instance of int, string given in /data/users/joelm/user-documentation/guides/hack/20-types/01-introduction-examples/hack.php.type-errors on line 22
    

    看到这个例子里的代码,我们可以很清晰的知道仅允许传递int型值。这样API的调用者知道需要传递什么类型的值。为方法和属性添加显式类型声明,配合Hack typechecker,你就有了一款真正的很强的安全基础的动态编程语言。

    要想了解代码中可以使用哪些类型以及在哪纺织显式类型标注,查看:

    • 类型系统
    • 类型标注
  • 相关阅读:
    iOS 开发笔记-获取某个APP素材
    iOS UI基础-15.0 UIWebView
    iOS UI基础-14.0 DatePicker
    iOS UI基础-13.0 数据存储
    iOS UI基础-12.0 Storyboard
    iOS UI基础-11.0 UINavigationController
    iOS UI基础-10.0 QQ聊天布局之键盘及文本使用
    iOS 开发技巧总结
    iOS 设计模式-NSNotificationCenter 通知中心
    iOS UI基础-9.2 UITableView 简单微博列表
  • 原文地址:https://www.cnblogs.com/x3d/p/5472222.html
Copyright © 2020-2023  润新知