Haxe 2 - Haxe 3迁移指南

2023-10-11 21:58
文章标签 指南 迁移 haxe

本文主要是介绍Haxe 2 - Haxe 3迁移指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官网英文原文:http://haxe.org/manual/haxe3_migration

混合类型数组
症状: 编译错误 Arrays of mixed types are only allowed if the type is forced to Array<Dynamic>
解释:Haxe 2允许这样定义混合数组: [1, "foo"],编译器会自动推断其类型为Array<Dynamic>。Haxe 3不允许如此定义,除非数组被显式声明为Array<Dynamic>。
修正:使用Array<Dynamic>显式定义混合类型数组。包括以下几种情形:
赋值到类型为Array<Dynamic>的变量: var a:Array<Dynamic> = [1, "foo"];
赋值到类型为Array<Dynamic>的类成员域
将其作为需求Array<Dynamic>类型的函数参数
从声明返回类型为Array<Dynamic>的函数返回值
例程:

// haxe 2
var x = [1, "foo"];

// haxe 3
var x:Array<Dynamic> = [1, "foo"];

Callback关键字
症状:编译错误 callback syntax has changed to func.bind(args)
解释:Haxe 2 had a callback keyword which could be used for partial application. In haxe 3 the special field bind can be invoked on functions.
修正:Replace callback(func,args) with func.bind(args)
例程:

function add(a, b) return a + b;
// haxe 2
callback(add, 1);
// haxe 3
add.bind(1);

系统平台API的整理统一

症状:Class not found errors for the following packages:
cpp, cpp.io, cpp.net
neko, neko.db, neko.io, neko.net, neko.zip
php, php.db, php.io, php.net
解释:Haxe 3 generalized several APIs of sys-platforms in the sys package. The platform-specific versions from haxe 2 were removed.
修正:Use the platform-independent classes in sys, sys.db sys.io and sys.net instead.

Hash和IntHash类已移除

症状:编译错误 Hash has been removed, use Map instead or IntHash has been removed, use Map instead
解释:Haxe 2 provided Hash and IntHash as toplevel classes. In haxe 3 their implementations was moved to the haxe.ds package and a general-purpose Map type remains in the toplevel.
修正:
Replace Hash with Map, possibly adding an explicit String key if required
Replace IntHash with Map, possibly adding an explicit Int key if required
例程:

// haxe 2
var hash = new Hash();
var intHash = new IntHash();

// haxe 3
var hash = new Map();
var intHash = new Map();

hash.set("foo", 1);
intHash.set(1, 2);

haxe.rtti接口

症状:编译错误 Use @:generic instead of implementing haxe.Generic or Use @:rtti instead of implementing haxe.rtti
解释:Haxe 2 used the special interfaces haxe.rtti.Generic and haxe.rtti.Infos to enable particular behavior. In haxe 3 they have been replaced by @:generic and @:rtti metadata respectively.
修正:
Remove implements haxe.rtti.Generic and add @:generic metadata to the class
Remove implements haxe.rtti.Infos and add @:rtti metadata to the class
例程:

// haxe 2
class GenericClass extends haxe.rtti.Generic { }
class RttiClass extends haxe.rtti.Infos { }

// haxe 3
@:generic class GenericClass { }
@:rtti class RttiClass { }

内联变量的初始化

症状:编译错误 Variable initialization must be a constant value
解释:Haxe 2 allowed arbitrary expressions as initialization to inline variables. This could cause unexpected behavior because expressions with potential side-effects were injected to the place of their access. Haxe 3 restricts the allowed expressions to constant ones, i.e. those that have no side-effects.
修正:Use an inline function returning the value instead.
例程:

// haxe 2
static inline var x = [];

// haxe 3
static inline function x() {
    return [];
}

Int32
症状:编译错误 haxe.Int32 has been removed, use normal Int instead or errors related to readUInt30, readInt31, writeUInt30, writeInt31
解释:Haxe 3 provided the haxe.Int32 Api to enable 32-bit integer operations across all targets. This is no longer necessary for haxe 3, so the Api has been removed.
修正:
replace all occurences of Int32 with Int
replace readUInt30 and readInt31 with readInt32
replace writeUInt30 and writeInt32 with writeInt32

接口语法变化

症状:编译错误 Interfaces cannot implements another interface (use extends instead) or Unexpected ,
解释:In haxe 2 interfaces would use implements to extend other interfaces, and multiple extends and implements declaration were separated by a comma. In haxe 3 interfaces use extends instead and the separating comma is no longer allowed.
修正:
replace implements with extends on interface declarations
remove the comma separating multiple implements and extends declarations
例程:

// haxe 2
interface InterfaceSyntax { }
interface InterfaceSyntax2 implements InterfaceSyntax { }
class InterfaceSyntaxClass extends haxe.Template, implements InterfaceSyntax2 { }

// haxe 3
interface InterfaceSyntax { }
interface InterfaceSyntax2 extends InterfaceSyntax { }
class InterfaceSyntaxClass extends haxe.Template implements InterfaceSyntax2 { }

Macro reification changes

症状:Various compiler errors when using macro reification
解释:The reification syntax of haxe 2 has been changed for haxe 3. While now being more flexible and readable, it likely breaks haxe 2 reification code.
修正:
replace $(value) with $v{value}
例程:

// haxe 2
var v = macro $(1);

// haxe 3
var v = macro $v{1};
Order of import and using
症状:The compiler infers identifiers to the wrong type.
解释:Haxe 2 resolved unknown identifiers by checking the list of imported modules from top to bottom. Haxe 3 checks this list from bottom to top.
修正:Reverse the declarations of import and using in a file that causes problems.

属性的访问器
症状:编译错误 Custom property accessor is no longer supported, please use get/set
解释:In haxe 2 it was possible to use custom names for the getter and setter of a property. Haxe 3 enforces the naming scheme of get_propertyName and set_propertyName for the getter and setter respectively.
修正:Fixing this involves two steps per property:
use get and set in the property declaration, e.g. var prop(get,set):Int;
rename the accessor function to get_propertyName and set_propertyName for the getter and setter respectively
例程:

// haxe 2
var property(getProperty, setProperty):Int;
function getProperty() return 1
function setProperty(i) return 1

// haxe 3
var property(get, set):Int;
function get_property() { return 1; }
function set_property(i) {return 2; }

属性域的创建

症状:编译错误 This field cannot be accessed because it is not a real variable
解释:In haxe 2 properties always had a real field representation, even if they did not need one. In particular, this applied to pure getter/setter properties. Haxe 3 treats properties as real variables only if they have a default or null access.
修正:Add @:isVar to the property in question.
例程:

// haxe 2
var property(get, set):Int;
function get_property() { return property; }
function set_property(i) {return property = i; }

// haxe 3
@:isVar var property(get, set):Int;
function get_property() { return property; }
function set_property(i) {return property = i; }

字符串插值 interpolation

症状:编译错误 Std.format has been removed, use single quote 'string ${escape}' syntax instead
解释:Haxe 2 was using a haxe macro accessible as Std.format() for String interpolation. In haxe 3 single quotes syntax can be used instead.
修正:Remove the call to Std.format and enclose the String by ' instead of ".
例程:

var x = 12;
// haxe 2
var s = Std.format("x equals $x");
// haxe 3
var s = '$x * $x equals ${x * x}';
trace(s); // 12 * 12 equals 144

Switch的变化

症状:Various compiler errors or warnings in a switch expression
解释:By default Haxe 3 uses pattern matching. While this enables a concise and expressive way for many cases, it may introduce a few incompatibilities to the switch expression used in Haxe 2.
修正:Adding -D no-pattern-matching to the command line will disable pattern matching and retain the haxe 2 behavior. Otherwise it might be worthwhile to adjust the case expressions to conform with the new switch specification. This includes:
null patterns are not allowed and should be replaced by a guard-expression: case CTor("foo",x) if (x == null):
Unused variables will generate a warning because they might have a negative impact on the code output. They can be replaced with _ or an identifier starting with _ in case they are still refered to in documentation.
The | operator is used as or-operator and cannot be used to do in-case integer calculation anymore. These should be moved to e.g. an inline variable.
Some rare case-patterns may no longer be supported, in which case they can be replaced with a if .. else if ... else chain.
A compiler error Capture variables must be lower-case may indicate that a type name or enum constructor could not be found. Make sure that the intended type can be resolved.

若干Api变化

General:
haxe.BaseCode -> haxe.crypto.BaseCode
haxe.Md5 -> haxe.crypto.Md5
haxe.SHA1 -> haxe.crypto.Sha1
EReg.customReplace -> EReg.map
StringTools.isEOF -> StringTools.isEof
IntIter -> IntIterator
haxe.Stack -> haxe.CallStack
neko:
neko.zip.Reader -> haxe.zip.Reader
neko.zip.Writer -> haxe.zip.Writer

新的关键字

In order to support abstract types, an abstract keyword has been added to the language. If you use this as an identifier or a package name, the compiler will reject it in haxe3.

Tools for conversion of haxe2 code to haxe3 code.
Simon's library for getting a haxe2 code base running in haxe3 hx2compat, obviously this is always changing until haxe3 is released, this link is just added for developers working with haxe svn nightlies and can be useful as further guide to changes.

 

这篇关于Haxe 2 - Haxe 3迁移指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191089

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum