【问题标题】:How does a method know where it get called?方法如何知道它在哪里被调用?
【发布时间】:2016-10-11 08:32:24
【问题描述】:

我不知道如何用语言来描述我的问题,所以我用代码尝试一下:)

Groovy 的 selenium 实现 Gebish 是这样做的:

$("#myForm").with {
    $("input").value("abc")
}

这看起来很像 jQuery,而且几乎做同样的事情。 在此示例中,我将给定表单中每个输入 inside 的值设置为“abc”。但是 Groovy 是如何知道我是哪种形式的呢?或者换句话说,带有 input$ 方法如何知道它在哪里被调用以及它与谁有关系?

我知道.with { ... } 是一个it 变量,而$("input") 正在“查看”它。如果我创建自己的方法,如 $,它能够看起来是 it 而无需告诉方法存在 it,它会是什么样子?因为它是$("input").value("abc") 而不是$("input", it).value("abc")

我会自己研究它,但遗憾的是我什至不知道如何称呼我解释的内容。

我想它可以通过查看堆栈跟踪来工作,但我知道这将是最糟糕的事情:D

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    当您使用with 时,闭包内调用的任何方法或访问的属性都会针对调用with 的对象进行解析。这是一个非常简单的例子:

    '12345'.with {
      // prints 5, because the string that "with" is called on has 5 characters
      println size()  
    }
    

    所以上面的代码在功能上是一样的

    println '12345'.size()
    

    希望您的问题的答案现在应该是显而易见的

    Groovy 如何知道我是哪种形式?

    因为这个

    $("#myForm").with {
        $("input").value("abc")
    }
    

    有效:

    $("#myForm").$("input").value("abc")
    

    【讨论】: