我正在研究Haxe摘要,并且非常有兴趣构建一个抽象,它将包装一个类并将其统一到我的案例中Int
。
@:forward()
abstract Abs(Op)
{
public inline function new(value:Int = 0, name:String = "unnamed" )
{
this = new Op();
this.value = value;
this.name = name;
}
@:to
private inline function toInt():Int
{
return this.value;
}
}
class Op
{
public var value:Int = 0;
public var name:String = "no name";
public function new()
{
}
}
我遇到的问题是在定义@:from
方法时 - 它必须是static
并且只能使用一个参数 - 一个新值。因此,每当我从@:from
方法设置抽象的实例值时,我将不得不创建一个新的抽象实例,从而重置所有变量。
基本上我所说的是:
var a = new Abs(5, "my abs"); // value is 5; name is "my abs"
a = 100; // value is 100; name is reset to "unnamed" but I want it to be preserved
尽管我发现除了通过使用=
方法的隐式转换之外我们不能在摘要中重载@:from
运算符,我还没有找到真正实现此目的的方法宏。
如果您对如何做到这一点有任何想法,请提供一个极简主义的例子。
答案 0 :(得分:0)
这取决于你想做什么,但如果你使用它:
var a = new Abs(5, "my abs");
var myInt:Int = a;
它将使用抽象Abs.toInt
函数。
@:to
private inline function toInt():Int
{
return this.value;
}
另一种方式也有效:
var million = 1000000;
var myAbs:Abs = million;
它将使用静态Abs.fromInt
函数。
@:from
static inline function fromInt(value:Int)
{
return new Abs(value, "what");
}
这是因为它使用隐式强制转换。 http://haxe.org/manual/types-abstract-implicit-casts.html
这就是你要找的东西吗?