在groovy中使用“use”关键字/方法有什么用?

时间:2011-03-22 16:12:00

标签: groovy

我在Groovy中阅读了use个关键字。但是,由于它已被完全使用,所以无法提出。我也有类别类,在这个主题下,那也是什么?来自,Groovy In Action

class StringCalculationCategory {
  static def plus(String self, String operand) {
    try {
      return self.toInteger() + operand.toInteger()
    } catch (NumberFormatException fallback) {
      return (self << operand).toString()
    }
  }
}

use (StringCalculationCategory) {
  assert 1 == '1' + '0'
  assert 2 == '1' + '1'
  assert 'x1' == 'x' + '1'
}

使用上面的代码,任何人都可以说groovy中use关键字的用途是什么?以及上面的代码是做什么的?

3 个答案:

答案 0 :(得分:20)

请参阅Pimp My Library Pattern了解use的内容。

在您的情况下,它会使String.add(something)运算符超载。如果两个字符串都可以用作整数(toInteger()不会抛出异常),则返回这两个数字的总和,否则返回字符串的串联。

答案 1 :(得分:13)

如果您有一个没有源代码的类(例如在库中)并且您想要为该类添加新方法,那么

use 非常有用。

顺便说一下,Dustin Marx的博客中的this post 受实际事件的启发指出:

  

使用“关键字”实际上不是关键字,而是一种方法   Groovy的Object类的GDK扩展,通过提供   Object.use(Category,Closure)。还有很多其他方法   在Groovy GDK对象上提供,可以方便地访问   功能,可能看起来像语言关键字或功能   因为他们不需要对象的名称来继续它们。我不喜欢   使用这些名称在我的Groovy脚本中使用变量(例如,   println和sleep)以避免潜在的可读性问题。

还有其他类似的“关键字”实际上是Object类的方法,例如 with Groovy JDK documentation列出了这些方法。

答案 2 :(得分:1)

groovy.time.TimeCategory是一个很好的例子。与use()一起使用时,它可以使日期/时间声明非常清晰易读。

示例:

use (TimeCategory) {
    final now = new Date()
    final threeMonthsAgo = now - 3.months
    final nextWeek = now + 1.week
}