如果一個類型路徑在一個 .hx 文件中會多次用到,可以使用 import 導入來縮短它。這可以使我們省略包名來使用類型:
> If a type path is used multiple times in a .hx ?le,it might make sense to use an import to shorten it. This allows omitting the package when using the type:
~~~
import haxe.ds.StringMap;
class Main {
static public function main() {
// instead of: new haxe.ds.StringMap();
new StringMap();
}
}
~~~
第一行haxe.ds.StringMap被導入之后,編譯器可以在main函數中解析絕對的標識符 StringMap到它的包中。
> With haxe.ds.StringMap being imported in the ?rst line,the compiler is able to resolve the unquali?ed identi?er StringMap in the main function to this package. The module StringMap is said to be imported into the current ?le.
在這個例子中,我們實際上導入了一個模塊,而不只是模塊中的一個類型。這意味著所有在導入的模塊中定義的類型都是可用的。
> In this example, we are actually importing a module, not just a speci?c type within that module. This means that all types de?ned within the imported module are available:
~~~
import haxe.macro.Expr;
class Main {
static public function main() {
var e:Binop = OpAdd;
}
}
~~~
類型 Binop 是haxe.macro.Expr模塊中一個 enum(第2.4節)聲明,因此被提到的包導入之后就可用了。如果我們只要導入模塊中的一個特定類型,例如,import haxe.macro.Expr.ExprDef,程序會編譯失敗,提示Binop類沒有找到。
> The type Binop is an enum (2.4) declared in the module haxe.macro.Expr,and thus available after the import of said module. If we were to import only a speci?c type of that module, e.g. import haxe.macro.Expr.ExprDef, the program would fail to compile with Class not found : Binop.
關于導入有幾個方面需要了解:
> There are several aspects worth knowing about importing:
* 最下面的導入有最高的優先級(詳見 解析順序(第3.7.3節))。
* 靜態擴展(第6.3節)關鍵字 using 意味著 import 的效果。
* 如果一個enum被導入(直接或者作為模塊的一部分導入),所有它的enum構造函數(第2.4.1節)同樣也被導入(這就是在上面例子中允許 opAdd 的用法)。
> * The bottommost import takes priority (detailed in Resolution Order (Section 3.7.3)).
> * The static extension (6.3) keyword using implies the effect of import.
> * If an enum is imported (directly or as part of a module import), all its enum constructors (2.4.1) are also imported (this is what allows the OpAdd usage in the above example).
此外,也可以導入類的靜態字段并不受限制的使用它們。
> Furthermore, it is also possible to import static ?elds (4) of a class and use them unquali?ed:
~~~
import Math.random;
class Main {
static public function main() {
random();
}
}
~~~
必須特別注意,字段名或者局部變量名和包名的沖突:因為它們優先級高于包,一個局部變量名為haxe,會阻擋整個haxe包的使用。
> Special care has to be taken with ?eld names or local variable names that con?ict with a package name: Since they take priority over packages, a local variable named haxe blocks off usage the entire haxe package.
**通配符導入**:Haxe允許使用 .* 使 import可以導入一個包中所有的模塊,模塊中的所有類型或者類型中的所有靜態字段。理解這種導入只通過一個在下面例子中的單獨級別:
> **Wildcard import** Haxe allows using .* to allow import of all modules in a package, all types in a module or all static ?elds in a type. It is important to understand that this kind of import only crosses a single level as we can see in the following example:
~~~
import haxe.macro.*;
class Main {
static function main() {
var expr:Expr = null;
//var expr:ExprDef = null; // Class not found : ExprDef
}
}
~~~
使用通配符到haxe.macro的導入,使這個包中的 Expr模塊可以被訪問,但是它不能使Expr模塊的子類型ExprDef被訪問。這個規則當一個模塊被導入時也擴展到靜態字段。
> Using the wildcard import on haxe.macro allows accessing Expr whichisa module in this package, but it does not allow accessing ExprDef which is a sub-type of the Expr module. This rule extends to static ?elds when a module is imported.
當使用通配符導入一個包,編譯器并不急于處理包中的所有模塊。這意味著這些模塊除非被明確使用否則不會實際的被編譯器發現,也不會出更為生成的輸出的一部分。
> When using wildcard imports on a package the compiler does not eagerly process all modules in that package. This means that these modules are never actually seen by the compiler unless used explicitly and are then not part of the generated output.
**使用別名導入** 如果一個類型或靜態字段在一個導入它的模塊中經常使用,可以為它引入別名為一個簡短的名字。這也可以用來通過給定一個唯一的標識符來消除命名沖突。
> **Import with alias** If a type or static ?eld is used a lot in an importing module it might help to alias it to a shorter name. This can also be used to disambiguate con?icting names by giving them a unique identi?er.
~~~
import String.fromCharCode in f;
class Main {
static function main() {
var c1 = f(65);
var c2 = f(66);
trace(c1 + c2); // AB
}
}
~~~
這里我們導入String.fromCharCode為 f,使我們可以使用 f(65) 和 f(66)。達到和局部變量一樣的使用,這個方法是編譯時功能,不會有運行時開銷。
> Here we import String.fromCharCode as f which allows us to use f(65) and f(66). While the same could be achieved with a local variable, this method is compile-time exclusive and guaranteed to have no run-time overhead.
**從Haxe3.2.0后 ,Haxe允許使用更自然的 as 替代 in **。
> **Since Haxe 3.2.0**
Haxe also allows the more natural as in place of in.
- 空白目錄
- 1.Haxe介紹
- 1.1.Haxe是什么
- 1.2.關于本文檔
- 1.2.1.作者及貢獻者
- 1.2.2.License
- 1.3Hello World
- 1.4.Haxe的歷史
- 2.類型
- 2.1.基本類型
- 2.1.1.數值類型
- 2.1.2.溢出
- 2.1.3.數值運算符
- 2.1.4.Bool類型
- 2.1.5.Void類型
- 2.2.為空性
- 2.2.1.可選參數和為空性
- 2.3.類實例
- 2.3.1.類的構造函數
- 2.3.2.繼承
- 2.3.3.接口
- 2.4.枚舉實例
- 2.4.1.Enum構造函數
- 2.4.2.使用枚舉
- 2.5.匿名結構
- 2.5.1.結構值的JSON形式
- 2.5.2. 結構類型的類記法
- 2.5.3.可選字段
- 2.5.4.性能影響
- 2.6.函數類型
- 2.6.1.可選參數
- 2.6.2.默認值
- 2.7.動態類型
- 2.7.1.Dynamic使用類型參數
- 2.7.2.實現Dynamic
- 2.8.抽象類型
- 2.8.1.隱式類型轉換
- 2.8.2.運算符重載
- 2.8.3.數組訪問
- 2.8.4.選擇函數
- 2.8.5.枚舉抽象類型
- 2.8.6.轉發抽象類型字段
- 2.8.7.核心類型抽象
- 2.9.單形
- 3.類型系統
- 3.1.Typedef
- 3.1.1.擴展
- 3.2.類型參數
- 3.2.1.約束
- 3.3.泛型
- 3.3.1.泛型類型參數解釋
- 3.4.變異
- 3.5.統一
- 3.5.1.類/接口 之間
- 3.5.2.結構子類型化
- 3.5.3.單形
- 3.5.4.函數返回
- 3.5.5.通用基本類型
- 3.6.類型推斷
- 3.6.1.由上而下推斷
- 3.6.2.局限
- 3.7.模塊和路徑
- 3.7.1.模塊子類型
- 3.7.2.Import
- 3.7.3.解析順序
- 4.類字段
- 4.1.變量
- 4.2.屬性
- 4.2.1.常見訪問標識符組合
- 4.2.2.對類型系統的影響
- 4.2.3.getter和setter的規則
- 4.3.方法
- 4.3.1.重寫方法
- 4.3.2.變異和訪問修飾符的影響
- 4.4.訪問修飾符
- 4.4.1.可見性
- 4.4.2.Inline
- 4.4.3.Dynamic
- 4.4.4.Override
- 4.4.5.Static
- 5.表達式
- 5.1.塊
- 5.2.常量
- 5.3.二元操作符
- 5.4.一元操作符
- 5.5.數組聲明
- 5.6.對象聲明
- 5.7.字段訪問
- 5.8.數組訪問
- 5.9.函數調用
- 5.10.var
- 5.11.局部函數
- 5.12.new
- 5.13.for
- 5.14.while
- 5.15.do-while
- 5.16.if
- 5.17.switch
- 5.18.try/catch
- 5.19.return
- 5.20.break
- 5.21.continue
- 5.22.throw
- 5.23.類型轉換
- 5.23.1.不安全轉換
- 5.23.2.安全轉換
- 5.24.類型檢查
- 6.語言特性
- 6.1.條件編譯
- 6.2.Externs
- 6.3.靜態擴展
- 6.3.1.標準庫中的靜態擴展
- 6.4.模式匹配
- 6.4.1.介紹
- 6.4.2.枚舉匹配
- 6.4.3.變量捕獲
- 6.4.4.結構匹配
- 6.4.5.數組匹配
- 6.4.6.Or 模式
- 6.4.7.守護
- 6.4.8.多個值的匹配
- 6.4.9.提取器
- 6.4.10.窮盡性檢查
- 6.4.11.無效的模式檢查
- 6.5.字符串插值
- 6.6.數組推導
- 6.7.迭代器
- 6.8.函數綁定
- 6.9.元數據
- 6.10.訪問控制
- 6.11.內聯構造函數
- 7.編譯器用法
- 7.1.編譯器標記
- 8.編譯器功能
- 8.1.內建編譯器元數據
- 8.2.無用代碼消除
- 8.3.編譯器服務
- 8.3.1.概述
- 8.3.2.字段訪問完成
- 8.3.3.調用參數完成
- 8.3.4.類型路徑完成
- 8.3.5.使用完成
- 8.3.6.位置完成
- 8.3.7.頂級完成
- 8.3.8.完成服務
- 8.4.資源
- 8.4.1.嵌入資源
- 8.4.2.檢索文本資源
- 8.4.3.檢索二進制資源
- 8.4.4.實現細節
- 8.5.運行時類型信息
- 8.5.1.RTTI 結構
- 8.6.靜態分析儀
- 9.宏
- 9.1.宏上下文
- 9.2.參數
- 9.2.1.ExprOf
- 9.2.2.常數表達式
- 9.2.3.其它的參數
- 9.3.具體化
- 9.3.1.表達式具體化
- 9.3.2.類型具體化
- 9.3.3.類具體化
- 9.4.工具
- 9.5.類型構建
- 9.5.1.枚舉構建
- 9.5.2.@:autoBuild
- 9.5.3.@:genericBuild
- 9.6.限制
- 9.6.1.Macro-in-Macro
- 9.6.2.靜態擴展
- 9.6.3.構建順序
- 9.6.4.類型參數
- 9.7.初始化宏
- 10.標準庫
- 10.1.字符串
- 10.2.數據結構
- 10.2.1.數組
- 10.2.2.向量
- 10.2.3.列表
- 10.2.4.GenericStack
- 10.2.5.Map
- 10.2.6.Option
- 10.3.正則表達式
- 10.3.1.匹配
- 10.3.2.分組
- 10.3.3.替換
- 10.3.4.分割
- 10.3.5.Map
- 10.3.6.實現細節
- 10.4.Math
- 10.4.1.特殊數值
- 10.4.2.數學錯誤
- 10.4.3.整數數學
- 10.4.4.擴展
- 10.5.Lambda
- 10.6.模板
- 10.7.反射
- 10.8.序列化
- 10.8.1.格式化序列化
- 10.9.Xml
- 10.9.1.開始使用Xml
- 10.9.2.解析Xml
- 10.9.3.編碼Xml
- 10.10.Json
- 10.10.1.解析JSON
- 10.10.2.編碼JSON
- 10.10.3.實現細節
- 10.11.Input/Output
- 10.12.Sys/sys
- 10.13.遠程處理
- 10.13.1.遠程連接
- 10.13.2.實現細節
- 10.14.單元測試
- 11.Haxelib
- 11.1.Haxe編譯器使用庫
- 11.2.haxelib.json
- 11.2.1.版本控制
- 11.2.2.依賴關系
- 11.3.extraParams.hxml
- 11.4.使用Haxelib
- 12.目標平臺細節
- 12.1.JavaScript
- 12.1.1.開始使用Haxe/JavaScript
- 12.1.2.使用外部JavaScript庫
- 12.1.3.注入原生JavaScript
- 12.1.4.JavaScript untyped函數
- 12.1.5.調試JavaScript
- 12.1.6.JavaScript目標元數據
- 12.1.7.為JavaScript暴露Haxe類
- 12.1.8.使用 require函數加載外部類
- 12.2.Flash
- 12.2.1.開始使用Haxe/Flash
- 12.2.2.嵌入資源
- 12.2.3.使用外部Flash庫
- 12.2.4.Flash目標元數據
- 12.3.Neko
- 12.4.PHP
- 12.4.1.開始使用Haxe/PHP
- 12.4.2.PHP untyped函數
- 12.5.C++
- 12.5.1.Using C++定義
- 12.5.2.Using C++ 指針
- 12.6.Java
- 12.7.C#
- 12.8.Python