gpt4 book ai didi

haxe - 非类型类型参数

转载 作者:行者123 更新时间:2023-12-05 04:04:19 25 4
gpt4 key购买 nike

如果我的类仅因代码中使用的某些常量而不同怎么办?有没有可能没有运行时成本的通用实现?

这是例子(有点太长了...)

@:enum abstract Param(Int) {
var foo = 0;
var bar = 1;
}

class WorkBase {

public function new() {}

private inline function work_impl(p: Param): Void {

if(p == foo) {
trace('foo');
}
else {
trace('bar');
}
}

public function work(): Void {

}
}

class WorkFoo extends WorkBase{
override public function work(): Void {
work_impl(foo);
}
}

class WorkBar extends WorkBase {
override public function work(): Void {
work_impl(bar);
}
}

class Test {

public static function main() {
var workFoo = new WorkFoo();
var workBar = new WorkBar();
workFoo.work();
workBar.work();
}
}

在使用-D analyzer-optimize 编译后,我们将看到WorkFoo.work()WorkBar.work() 函数被优化了并且仅包含与 Param 值之一匹配的代码分支。在现实生活中,work_impl() 中有很多这样的比较,它们都被优化掉了。那很好。

但是,如果我不想手动创建 WorkFooWorkBar 怎么办?是否有可能做这样的事情:

@:generic
class WorkBase<PARAM> {
private inline function work_impl(p: Param): Void {
...
}

public function work(): Void {
work_impl(PARAM);
}
}

我知道的最接近的是 const-type-parameter .但我认为通用构建在这里不是一个好的选择。

最佳答案

The closest thing I know is const-type-parameter. But I do not feel generic build is a good choice here.

Const类型参数可以不用@:genericBuild - const 类型参数结合 @:generic足以获得所需的优化:

@:enum abstract Param(Int) from Int {
var foo = 0;
var bar = 1;
}

@:generic class Work<@:const PARAM:Int> {
public function new() {}

public function work():Void {
if (PARAM == foo) {
trace('foo');
} else {
trace('bar');
}
}
}

class Main {
public static function main() {
var workFoo = new Work<0>();
var workBar = new Work<1>();
workFoo.work();
workBar.work();
}
}

由于@:generic ,为每个常量值生成一个类,例如在 JS 上输出如下所示:

var Work_$0 = function() {
};
Work_$0.prototype = {
work: function() {
console.log("source/Main.hx:11:","foo");
}
};
var Work_$1 = function() {
};
Work_$1.prototype = {
work: function() {
console.log("source/Main.hx:13:","bar");
}
};

请注意,由于某种原因,此示例在 Haxe 3.4.7 中因“约束检查失败”而失败,但在 Haxe 4 预览版 4 及更高版本中运行良好。另一个限制是 new Work<Param.foo>() 都不是也不new Work<foo>()工作 - 你需要传递实际的常量值。

关于haxe - 非类型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52762071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com