目前为止,你已经了解了一些类型的处理和限制,也可以看到编译工具怎么类型化值使其和其它类型区分开来。然而,你要处理的很多数据都需要一些格式转换,例如一个 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
- 附加部分