目前為止,你已經了解了一些類型的處理和限制,也可以看到編譯工具怎么類型化值使其和其它類型區分開來。然而,你要處理的很多數據都需要一些格式轉換,例如一個 car 類可以放入一個 Vehicle 類型的變量。為了達到這個目的,需要進行轉換(cast)。
事實上,Haxe 的 casting 不可能像 C++ 那樣隨意轉換數據,舉個例子,但是可以轉換數據 格式變量為源而不是執行不安全的數據分配。
使用 C++ 或者 Java 的用戶會很熟悉 casting,括號標記希望返回到變量的或者值的類型,像這樣:
~~~
double myDbl = (double) 44;
~~~
這里,字面整數 `44` 在存儲到變量 `myDbl` 之前轉換為浮點數。`casting` 是有效的,因為數據類型具有相似的性質,盡管當處理更復雜的數據轉換,自定義解析例程是必須的。在 Haxe 里,變量允許包含任何數據,本質上,雖然編譯工具可能期望變量在它的生命周期提供相同的功能而不管它包含了什么數據。
# cast函數
* * * * *
Haxe 支持一個和 C/C++ 的 `casting` 類似的方法,通過 `cast` 函數來偽裝。只需要傳遞給 `cast` 函數一個值,和希望轉換的類型,函數會返回新的轉換之后的值。這里是 C++ 的例子用 Haxe 重寫,使用 cast 函數:
~~~
var myFlt : Float = cast(44, Float);
~~~
現在,當然你可以依靠類型推斷推斷出傳遞的字面值 `44` 到變量的類型,而且某些情況下,這可能是最簡單的最主要的轉換方式。現在 `cast` 函數很好的轉換一個整數為浮點數,但是轉換一個浮點數回到整數是不能使用 `cast` 的。為什么?很不幸,`casting` 有很大的局限性。傳遞到 `cast` 函數的變量必須繼承傳遞到函數中的類型。如果你記得之前學習的關于整數和浮點數的表示,應該注意到 Int 類型繼承了 Float 類型。這就是說,一個整數是浮點數的一種,一個浮點數卻不是整數類型,所以只能單向轉換。
(**實際操作時,如 44.0 的浮點數,可以通過 cast 函數轉換為 Int 類型,但是 44.1 雖然可以通過編譯,但是在 Neko 運行則不行,其它平臺未測試。**)
要繞過類型投射限制使用 cast,你可以選擇一個動態路線,所以沒有編譯工具檢查的執行。只需要忽略 `cast` 函數的類型參數:
~~~
var myFlt : Float = cast(44);
~~~
這是所謂的不安全轉換,用一個 Dynamic 類型變量傳遞參數,而不是通過調用一個cast函數返回,也會執行相同的功能,例如:
~~~
var tmp : Dynamic = 44;
var myFlt : Float = tmp;
~~~
如前面看到的,這影響存進變量的值,但是仍然不會實際轉換值:
轉換一個 Int 到 Float 是不好的例子,因為這一組, Haxe 編譯工具會自動執行。然而,簡短創建自己的類,將很難被證明。只要記住 `cast` 函數是通常需要的。
# 簡單的類型轉換函數
* * * * *
Haxe 提供很多函數關于特定的轉換簡單類型的目標。這些可以在 Std 類中找到。這些方法基于數據的開始類型分組,而命名習慣不會幫助它們特別的區分。
類中包含的函數術語叫做方法。這個術語用于描述類的函數,在本書中經常使用。
**需要注意,在Haxe 3中,有些方法被從Std 類中轉移到其它類,下表中的方法并未完全依照 Haxe 3 歸類方法**
|Std方法|描述|
| -- | -- |
|string(val:Dynamic): String|轉換任何值到String|
|chr(var:Int): String|轉換ASCII代碼為String|
|ord(val: String)|轉換給定字符串的第一個字母為它的等價ASCII|
|int(val:Float): Int|對一個浮點數向下取整|
|parseFloat(val:String): Float|轉換一個字符串為浮點數|
|parseInt(val:String): Int|轉換一個字符串為整數|
當使用上面任何的轉換方法,必須在方法之前調用 `Std` 類名并使用點方法訪問,因為每個方法都是 `Std` 類的靜態方法。快速看一下如何使用這些轉換方法。
輸入下面的代碼,并保存一個文件,名為 TypeConversion.hx :
~~~
class TypeConversions
{
public static function main()
{
var myInt:Int = 45;
var myFlt:Float = 0;
var myStr:String = "";
myStr = Std.string(myInt);
trace(myStr);
myFlt = Std.parseFloat(myStr) / 2;
trace(myFlt);
myInt = Std.int(myFlt);
trace(myInt);
}
}
~~~
設置初始變量值后,整數值是 `45`,保存在 `myInt` 中。然后轉換為 String 類型并傳遞給變量 `myStr` 。接下來,`myStr` 的值轉換為 Float 類型,結果為 `45.0` 。然而,要讓這個轉換更明顯,使用它除以 `2` ,結果是 `22.5 `。最后一個轉換是轉換浮點數成為整數,將丟失小數點后的精度。
# 值的類型比較
* * * * *
通常,特別是處理保存在 Dynamic 類型變量中的值時,需要在使用之前知道變量的值的類型。`Std` 類包含一個方法叫做 `is` ,可以執行這樣一個檢查。可以和 `cast` 函數類似的方法使用它,它返回一個布爾值,而不是新的轉換的值;如果值為指定類型則返回 `true`, 否則返回 `false` 。這是一個例子:
~~~
var isInt : Bool = Std.is( myVar, Int );
~~~
這個語句如果 `myVar` 是一個 Int 類型,會返回 `true`,否則返回 `false`。如果變量的值是多種類型之一,那么需要重復驗證它可能的類型。
- 本書目錄
- 第一章:Haxe介紹
- 互聯網開發的一個問題
- Haxe是什么,為什么產生
- Haxe編譯工具
- Haxe語言
- Haxe如何工作
- 那么Neko是什么
- Haxe和Neko的必須條件
- 本章摘要
- 第二章:安裝、使用Haxe和Neko
- 安裝Haxe
- 使用Haxe安裝程序
- 在Windows上手動安裝Haxe
- Linux上手動安裝Haxe
- 安裝Neko
- Windows上手動安裝Neko
- 在Linux上安裝Neko
- Hello world! 一式三份
- 編譯你的第一個Haxe應用
- 你的程序如何編譯
- HXML編譯文件
- 編譯到Neko
- 編譯為JavaScript
- 程序結構
- 編譯工具開關
- 本章摘要
- 第三章:基礎知識學習
- Haxe層級結構
- 標準數據類型
- 變量
- 類型推斷
- 常數變量
- 簡單的值類型
- 浮點類型
- 整型
- 選擇數值類型
- 布爾類型
- 字符串類型
- 抽象類型
- Void 和 Null
- 動態類型
- unknown類型
- 使用untyped繞過靜態類型
- 注釋代碼
- 轉換數據類型
- Haxe數組
- Array
- List
- Map
- Haxe中使用日期時間
- 創建一個時間對象
- Date組件
- DateTools類
- 操作數據
- 操作符
- Math類
- 使用String函數
- 本章摘要
- 第四章:信息流控制
- 數據存放之外
- 條件語句
- if語句
- switch語句
- 從條件語句返回值
- 循環
- while循環
- for循環
- 循環集合
- Break和Continue
- 函數
- 類的函數
- 局部函數
- Lambda類
- 本章摘要
- 第五章:深入面向對象編程
- 類和對象
- 實例字段
- 靜態字段
- 理解繼承
- Super
- 函數重載
- 構造器重載
- toString()
- 抽象類和抽象方法
- 靜態字段,實例變量和繼承
- 繼承規則
- 使用接口
- 高級類和對象特性
- 類的實現
- 類型參數
- 匿名對象
- 實現動態
- Typedef
- 擴展
- 枚舉
- 構造器參數
- 本章摘要
- 第六章:組織你的代碼
- 編寫可重用代碼
- 使用包
- 聲明一個包
- 隱式導入
- 顯式導入
- 枚舉和包
- 類型查找順序
- 導入一個完整的包
- 導入庫
- Haxe標準庫
- Haxelib庫
- 其他項目中的庫
- 外部庫
- 使用資源
- 文檔化代碼
- 離線文檔
- 在線文檔
- 單元測試
- haxe.unit包
- 編寫測試
- 本章摘要
- 第七章:錯誤調試
- trace函數
- trace輸出
- haxe的trace和ActionScript的trace
- 異常
- 異常處理
- CallStack和ExceptionStack
- 異常管理類
- 創建完全的異常處理類
- 異常類代碼
- 本章摘要
- 第八章:跨平臺工具
- XML
- XML剖析
- Haxe XML API
- 正則表達式
- EReg類
- 模式
- 定時器
- 延遲動作
- 隊列動作
- MD5
- 本章摘要
- 第九章:使用Haxe構建網站
- Web開發介紹
- Web 服務器
- 使用Web服務器發布內容
- HTML速成課程
- Haxe和HTML的區別
- NekoTools Web Server
- Apache安裝mod_neko
- Windows安裝Apache和mod_neko
- Linux安裝Apache和Mod_Neko
- 第一個Haxe網站
- 使用Neko作為網頁Controller
- neko.Web類
- Neko作為前端控制器
- 本章摘要
- 第十章:使用模板進行分離式設計
- 什么是模板
- Template類
- Template語法
- 使用資產
- 何時在模板中使用代碼
- 服務器端模板的Templo
- 安裝Templo
- 使用Templo
- haxe.Template和mtwin.Templo表達式上的區別
- Attr表達式
- Raw表達式
- 邏輯表達式
- 循環表達式
- set, fill, 和 use表達式
- Templo中使用宏
- 手動編譯模版
- 第十一章:執行服務端技巧
- 第十二章:使用Flash構建交互內容
- 第十三章:使用IDE
- 第十四章:通過JavaScript制作更多交互內容
- 第十五章:通過Haxe遠程通信連接所學
- 第十六章:Haxe高級話題
- 第十七章:Neko開發桌面應用
- 第十八章:用SWHX開發桌面Flash
- 第十九章:多媒體和Neko
- 第二十章:使用C/C++擴展Haxe
- 附加部分