【问题标题】:Haxe operator overloadingHaxe 运算符重载
【发布时间】:2013-12-27 08:25:42
【问题描述】:

如何以方便使用的方式完成运算符重载?

如您所见,将运算符重载放在类中没有任何作用。另外,如果我使用“抽象”,我什至不能在 Dog 上调用 Bark() 方法。
运算符重载不应该如此复杂和不可行。

【问题讨论】:

  • 我不得不截取代码,因为它一直在抱怨我的格式。
  • 文档对此非常清楚。运算符重载仅用于摘要,摘要不公开底层字段。如果您有实际问题要问,请提出。如果您有具体建议,请将其发布在 Haxe 问题跟踪器上。到目前为止,这只是一个固执己见的咆哮,发布在互联网上少数几个不容忍它们的地方之一;)
  • 我的问题很明显是如何实现可行的运算符重载。

标签: operators operator-overloading overloading abstract haxe


【解决方案1】:

在haxe 3.1.3中,可以在abstract前加上@:forward,将底层的属性和方法转发到abstract。

@:forward // add this!
abstract Dog2(Dog) to Dog from Dog
{
    ...
}

new Dog2().Bark(); // no more error!

您还可以将特定方法/属性转发给摘要。见Forwarding abstract fields

【讨论】:

  • 算子重载之类的转发如何?
  • 不是。转发是您可以对摘要执行的操作,以使 Dog 中的原始方法在 Dog2 中可用。所以 Dog2 与 Dog 相同,但添加了重载运算符。
  • 他正在寻找一种使运算符重载变得方便的方法。现在添加 @:forward 可以解决这个问题...
【解决方案2】:

运算符重载目前仅适用于摘要。您可以做的是创建宏并将其应用到您的上下文(执行操作的位置)并转换表达式树,以便将操作映射到正确的方法。

【讨论】:

  • 你是说我可以使用我需要的操作符来调用宏吗?例如,如果我键入“new X() + new X()”,我可以让 '+' 运算符触发宏调用来转换树吗?
  • 您可以让包含方法进行转换。例如,您可以在 main() 上添加元数据 @:dogOperators 并让宏更改 AST。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2011-06-21
  • 2012-09-14
  • 2011-04-08
相关资源
最近更新 更多