【问题标题】:How to override "="如何覆盖“=”
【发布时间】:2015-09-09 07:16:48
【问题描述】:

我正在研究 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 方法的隐式强制转换之外,我们无法在抽象中重载 = 运算符,而且我还没有找到真正使用宏实现此目的的方法。

如果您对如何做到这一点有任何想法,请提供一个极简示例。

【问题讨论】:

  • 作为附带问题我想知道: 1. 我很好奇你为什么想要这个? 2. 如果 Op/Abs 有两个 Int 属性,预期的行为是什么?
  • 1.它非常有用,因为它非常抽象。 2.您将@:from方法设置为您想要表示为的变量;其他变量无关紧要,可以使用. 访问,如abs.otherIntVariable = 3;

标签: haxe abstract-type


【解决方案1】:

这取决于你想做什么,但如果你使用这个:

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

自己试试吧:http://try.haxe.org/#Ae1a8

这就是你要找的吗?

【讨论】:

  • 我猜我的英语不好。我想将 Abs 的实例设置为 Int (它将修改 value 变量)并保留所有其他变量 - 在此实例中命名
  • 在这种情况下,您正在寻找 @:from try.haxe.org/#Ae1a8 我已经更新了答案。
  • 是的,from 确实有效,但是正如您所见,由于@:from 方法的性质,name 变量不能从抽象的原始实例中复制。请阅读我的问题,我在那里解释过。
  • 我不明白,如果你想要默认值,@:from 方法也可以返回return new Abs(value);?或者你是否期望那里有另一个价值?
  • 如果基础类型有两个公共变量:namevalue,并且您的 @:from 方法设置了 value - 您如何保留旧的 name 属性?这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2020-07-28
  • 2012-02-25
  • 2015-05-02
  • 2012-11-13
相关资源
最近更新 更多