在GroovyShell中删除“this”-关键字

ldioqlga  于 8个月前  发布在  Shell
关注(0)|答案(2)|浏览(86)

我试图在我的java应用程序中使用GroovyShell来运行时执行代码。代码将用于测试,并将在程序完成时导出到Java文件。为了方便用户,我希望groovy的输入尽可能与将要执行的java代码相似。这意味着我,除其他外,将删除类型时,用户试图创建一个变量,以避免私有变量,即。

String str = "Lorem"

将作为

str = "Lorem".

然而,有一件事我似乎无法解决,用户通常可以调用方法foo(),但现在必须调用对象上的方法。

Java code {
        foo();
    }

    Groovy code {
        im = new InteractiveMode();
        im.foo();
    }

这当然是因为方法foo()是在对象this上调用的,在groovy代码中,对象this引用的是脚本而不是java对象。所以我的问题是我是否可以在groovy中覆盖this关键字,或者以其他方式允许在对象上调用方法,而不必每次都指定什么对象?

编辑:澄清

这就是我的代码现在的样子:

InteractiveMode test = new InteractiveMode();
GroovyShell gs = new GroovyShell();
gs.setVariable("im", test);
gs.evaluate("im.foo();");

我想用这个来得到同样的输出:

InteractiveMode test = new InteractiveMode();
GroovyShell gs = new GroovyShell();
gs.setVariable("im", test);
//Some groovy magic
gs.evaluate("foo();");
50few1ms

50few1ms1#

听起来好像您希望在创建GroovyShell时传入一个定制的配置。然后你可以像in this post描述的那样设置脚本基类。
如果您所需要的只是一些可从脚本访问的属性,您也可以考虑使用绑定。绑定只是属性名到属性的Map。如果你愿意,你甚至可以将Bindings设置为闭包,然后像方法一样调用它。使用绑定在this page的顶部附近进行了描述
如果你不想在脚本之外保存状态,那么我会使用Binding。如果你需要在脚本之外保存状态,就像在汽车例子中一样,那么在那篇文章中描述的基类就是你想要的。第三种选择是,如果您需要访问共享应用程序状态,则只需在运行脚本之前在脚本上设置委托。这显示在第一个链接的底部附近。

2uluyalo

2uluyalo2#

理解JavaScript中的this关键字可能有点棘手,但我将尝试以一种简单的方式解释它。
在JavaScript中,这是一个特殊的关键字,指的是执行函数的上下文。它是对调用函数的对象的引用。this的值取决于函数的调用方式,它可以在不同的情况下改变。
为了简化它,您可以将其视为一个占位符,根据函数的调用方式动态分配其值。
这里有一个简单的经验法则,可以帮助你理解这是如何工作的:
“这是指函数所属的对象或调用函数的对象。”
让我们通过几个场景来说明这是如何工作的:
全球背景:如果函数在全局上下文中调用(在任何对象或函数之外),这将引用全局对象,在浏览器中是window,在Node.js中是global。
对象的方法:如果函数作为对象的方法调用,this将引用该对象。
构造函数:如果函数被用作构造函数(使用new关键字),这将引用构造函数正在构建的新创建的对象。
显式绑定:有时候,你可以使用.call()、.apply()或.bind()等方法显式地将其绑定到特定的对象。
现在,让我们将这些知识应用到您的代码片段中:

javascript
Copy code
function hello() {
    let list = {
        firstName: "Jack"
    };
    return "Hello " + this.firstName;
}

console.log();在这种情况下,hello()函数是在全局上下文中调用的,因为它不是任何对象的方法。因此,这将引用全局对象(例如,浏览器中的窗口)。
然而,由于firstName属性没有在全局对象中定义,因此.firstName将是未定义的,并且您将获得输出:“你好未定义”
如果你想正确地访问列表对象的firstName属性,你应该像这样直接使用它:
JavaScript

function hello() {
    let list = {
        firstName: "Jack"
    };
    return "Hello " + list.firstName;
}

console.log(hello()); // Output: Hello Jack

在这个更新的版本中,我们直接使用列表对象来访问firstName属性,它给出了正确的输出:“你好杰克”
请记住,理解这一点可能需要一些练习,并习惯于可以使用它的不同场景。重要的是要注意函数是如何被调用的,以及它属于什么对象,以便确定this的值。
但是在GroovyShell中,本文指的是在GroovyShell中更改“this”关键字的行为的能力,GroovyShell是一个用于运行Groovy脚本的命令行工具。“this”关键字在面向对象编程中用于引用对象的当前示例。通过覆盖GroovyShell中的“this”关键字,可以改变它在脚本中使用时的行为方式。这对于测试或实验目的是有用的。

相关问题