【问题标题】:Is it possible to define a new operator in Groovy?是否可以在 Groovy 中定义一个新的运算符?
【发布时间】:2011-06-26 18:22:39
【问题描述】:

是否可以在 Groovy 中定义一个全新的运算符?我想表达一个交易,有人以 10 的价格购买了 200 件物品,如下所示:

def trade = 200 @ 10

这可以实现吗?

谢谢

编辑:我想更清楚地说明我对定义运算符而不是添加方法感兴趣。干杯。

【问题讨论】:

  • 不,目前这是不可能的,您必须使用现有的运算符来定义自己的操作
  • 看来Spock Boys 已经设法使用>>> 运算符来做到这一点,而Operator Overloading 提供的Operator Overloading 列表中没有提到mr. Muschko。有人可以解释如何完成或提供明确的否吗?我很害怕我觉得我不能接受当前的答案。感谢您对我的包容。
  • >>> 运算符已经存在于 Java 和 Groovy 中,它是 right shift unsigned 运算符。我 found it was covered by Groovy last week 在代码中挖掘时 ;-)
  • @Tim 感谢您清除它。我接受了本杰明的回答以及他随后的评论。

标签: groovy operators dsl


【解决方案1】:

我们一直希望能够在 Groovy 中通过用户定义运算符,但到目前为止,我们还没有解决随之而来的问题。所以目前的状态是 Groovy 不支持自定义操作符,只支持已经在使用的操作符。

【讨论】:

  • 写这个答案已经 3 年了。这个状态有什么变化吗?
  • 不……如果没有资金,明年不太可能改变
【解决方案2】:

我不太确定如何使 @ 符号起作用,但你当然可以添加这样的操作,我实际上发现它更具表现力:

Number.metaClass.buyFor { Integer price ->
   delegate * price
}

def result = 200.buyFor(10)
println result

【讨论】:

  • 感谢您的意见。不幸的是,这并不能真正回答我的问题。我知道我可以通过“猴子补丁”添加方法,但我真的很想定义一个运算符。
  • 看起来@ 符号尚不支持overloadable operator。如果您可以满足任何可用的运算符,则可以按上述方式实现它。
【解决方案3】:
Number.metaClass."@" {Integer x -> delegate * x} 

assert (2.'@' (2)) == 4

【讨论】:

  • 感谢您的参与。你很接近,但没有雪茄。正如我向 Ben 提到的,我正在寻找关于是否可以定义新的 OPERATOR 而不是添加方法的问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多