我有一个从带有beforeInterceptor的类继承的 Controller 。

这是我的基础课。

class FooBase {
    def beforeInterceptor = [action: {parentInterceptor()}]

    def parentInterceptor() {
        render("Snarge")
    }
}

这是不起作用的 Controller 的版本。
class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

这是一个有效的版本
class WorkingController extends FooBase
{
    def beforeInterceptor = {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

当我在WorkingController上调用index时,我得到输出SnargeBarFoo。当我在BrokenController上调用索引时,我得到一个IllegalAccessError
我想我有一个可行的版本,所以我的问题更多是关于这里发生了什么?为什么一个版本可以从子类访问父类,而另一个版本却不能呢?

我正在寻找的用例是能够将拦截器函数与except功能一起使用。这要求在使用映射实现拦截器时能够对其进行链接。

最佳答案

两者之间有区别

this.


this.&

以下代码有效-检查第三行:
class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {this&childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

文档指出以下内容。
Method Reference     .&      Get a reference to a method, can be useful for creating closures from methods

因此,我不确定,但是我想它与调用该方法的范围有关。也许系统创建了某种帮助程序类以执行关闭操作,从而导致该类不具有super.beforeInterceptor方法。

10-06 01:18