Hack語言特性之型別化

2021-09-08 11:50:33 字數 1326 閱讀 2283

hack最基礎的特性就是型別標註。php5已經開始支援物件的型別化,php7也提供了標量型別化宣告。hack提供了全面的型別標註支援,與其typecher配合使用,還可以實現快速、前置靜態型別驗證。

型別標準允許給類屬性、方法/函式引數、方法/函式返回值及**其它元件新增顯示型別,如int。

舉個例子,下面的**是用正規的php編寫的,沒有任何型別:

<?php

namespace hack\userdocumentation\overview\typing\examples\phpfunction;

function bar($a, $b) else

}var_dump(bar(3, -1));

var_dump(bar(-1, 10));

output

bool(true)

bool(false)

**作者的本意很清楚,$a 和 $b都是int型,**也是用於算術運算。但實際上沒有寫任何**來保證這個計算能正常進行。

假設你在對該**進行測試,在$a的值始終為正整數時好像每次都是正常的。你不會天真的以為這是段無錯**吧,看看這種情況:當$a <= 0,且$b不是int型值時,就會導致意圖不明的結果!

hack的型別標註機制可以幫助你防止這類執行時錯誤。你可以顯式告知hack你所希望的變數型別:

<?hh

namespace hack\userdocumentation\overview\typing\examples\hackfunction;

function bar(int $a, int $b) else

}var_dump(bar(3, -1));

var_dump(bar(-1, 10));

output

bool(true)

bool(false)

typechecker現在可以準確知曉開發者的意圖:兩個引數都是整數。typechecker會掃瞄所有**,且在每行**執行時知道是否不變數是否滿足條件。不用關心$a在執行時的值 - typechecker會確保$b型別是準確的。換句話說,hack的typechecker執行靜態型別檢查 - hack是一種靜態型別語言。

靜態型別語言 在編譯期間進行型別檢測,通常可以防止型別相關的錯誤。

動態型別語言 在執行時進行型別檢測,允許更多的靈活性,在損失讓型別錯誤通過的情況下

你可以採用hack的強型別特性,也可以繼續在hack中享受動態型別語言的靈活性。

如果你正在編寫**,可能有隱式型別的概念;當你敲出一行**時,你腦袋裡是會假定變數、引數等的型別的。hack的型別標註機制幫助開發者少犯錯誤並少引入錯誤:

Hack語言特性之型別化

hack最基礎的特性就是型別標註。php5已經開始支援物件的型別化,php7也提供了標量型別化宣告。hack提供了全面的型別標註支援,與其typecher配合使用,還可以實現快速 前置靜態型別驗證。型別標準允許給類屬性 方法 函式引數 方法 函式返回值及 其它元件新增顯示型別,如int。舉個例子,下...

c語言基礎(六)之型別

多級指標簡單demo main 函式指標demo int add int x,int y main c語言結構體 使用struct關鍵字。事例demo struct person main printf age d n p.age printf 結構體的長度 d n sizeof p c語言聯合體 ...

GO語言使用之型別斷言

型別斷言,由於介面是一般型別,不知道具體型別,如果要轉成具體型別,就需要使用型別斷言 型別斷言 func typeassertion x t ok 待檢測的型別斷言 y res x.float32 if res else y1 res1 x.int32 轉成float if res1 else 1 ...