Groovy 中的基本运算符重载
Posted
技术标签:
【中文标题】Groovy 中的基本运算符重载【英文标题】:elementary operator overloading in Groovy 【发布时间】:2017-10-29 15:17:34 【问题描述】:我是 Groovy 的新手,之前我只学过 C# 和 C++,所以我在习惯 Java 时遇到了一些问题,尤其是我们在项目中使用的 Groovy。所以这个问题涉及到 Groovy。
我正在尝试:
创建一个新类 X:class X
double val
为 X 类的变量重载基本运算符(+、-、*、/、** 等)
问题是: - 在 Groovy 中,我可以重载类 X 的运算符,包括一个属性 - 值(即双精度)
X plus(X obj)
X newobj = new X(this.val + obj.val)
return newobj
和
X plus(double obj)
X newobj = new X(this.val + obj)
return newobj
但是,如果双重对象位于第一位(左侧),我该怎么办?喜欢:
double a
X b
X result = a + b
// it will not work because operator + of a is not overloaded to provide addition of b
除了双重运算符,我是否需要重载类似的东西?:
ArrayList.metaClass.plus << Collection b ->
[delegate, b].transpose().collectx, y -> x+y
正如在 Overloading + operator for arrays in groovy
也许有办法将方法添加为访问元类的闭包?
不幸的是,数组示例是我在互联网上找到的最接近的答案。希望有办法!
【问题讨论】:
【参考方案1】:是的,您可以将其重新定义为 Double:Double.metaClass.plus = ...
小心!在 groovy 中
def d0 = 2.1
println d0.getClass() // java.math.BigDecimal
double d1 = 2.1
println d1.getClass() // java.lang.Double
【讨论】:
感谢它的工作!我不知道的问题是一些语言限制。我们不是在纯 Groovy 上工作,而是在为 GPU 编程开发的那个上工作,所以我可以在 groovy 中运行它,但测试在 GPU 上不起作用。所以我需要定义哑函数而不是重载:)以上是关于Groovy 中的基本运算符重载的主要内容,如果未能解决你的问题,请参考以下文章
Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )