【问题标题】:How does the Groovy in operator work?Groovy in 运算符是如何工作的?
【发布时间】:2011-01-05 07:32:08
【问题描述】:

Groovy 的“in”运算符在不同的情况下似乎有不同的含义。有时x in y 表示y.contains(x),有时它似乎调用y.isCase(x)

Groovy 如何知道调用哪一个? Groovy 是否知道使用 .contains 方法的特定类或类集?还是由其中一个对象上存在方法触发的行为?是否存在 in 运算符完全变成其他东西的情况?

【问题讨论】:

    标签: groovy operators in-operator


    【解决方案1】:

    in 是“会员操作员”。

    来自the documentation for Groovy 3(强调我的):

    8.6。会员运营商

    成员运算符(in)相当于调用isCase 方法。 List的上下文中,相当于调用 contains,如下例所示:

    def list = ['Grace','Rob','Emmy']
    assert ('Emmy' in list)           # (1)    
    

    (1) 相当于调用list.contains('Emmy')list.isCase('Emmy')

    所以,Groovy 总是调用isCase,如果是List,则映射到contains

    【讨论】:

      【解决方案2】:

      我做了一些实验,看起来in 运算符仅基于isCase 方法,如下代码所示

      class MyList extends ArrayList {
          boolean isCase(Object val) {
              return val == 66
          }
      }
      
      def myList = new MyList()
      myList << 55
      55 in myList // Returns false but myList.contains(55) returns true     
      66 in myList // Returns true but myList.contains(66) returns false
      

      对于 JDK 集合类,我想 in 运算符似乎基于 contains(),因为 isCase() 为这些类调用 contains()

      【讨论】:

      • 好的,有道理。我对“in”和isCase之间的关系感到困惑。我现在可以看到 contains 在使用容器作为案例标签时是有意义的。不过,为 in 运算符重用 isCase 有点令人惊讶,因为它允许在 String == true 中出现像 'asdf' 这样的意外表达式。
      • 这是正确的,但在 groovy 方面 imo 很差。虽然 case 语句行为和包含元素使用与集合相同的逻辑,但在其他情况下它们非常不同。例如,以下断言不通过:assert 'b' in 'buns'。这至少可以说是违反直觉的。
      • 谁能简单地告诉我isCase是什么意思?
      • isCase 是 Groovy 添加到 java.lang.Object groovy-lang.org/docs/latest/html/groovy-jdk/java/lang/… 的方法
      【解决方案3】:

      其实都是基于isCase。 Groovy 添加了一个基于 contains 方法的isCase method to Collections。任何带有 isCase 的类都可以与 in 一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多