我正在使用groovy扩展传统脚本系统。源脚本是“类似于Java的”,因此它几乎可以解析为具有一些预处理的常规脚本。
我正在使用invokeMethod()和missingMethod()来传递旧代码,从而使我能够使用闭包和其他常规功能来增强脚本。但是,原始脚本使用“ $ foo”类型的字符串来引用变量。当遗留方法被missingMethod()捕获时,我需要它不将该字符串评估为GString,而只是逐字输出。这有可能吗?
我试图使用gstring访问嵌套字段但它抛出异常groovy.lang.MissingPropertyException
我有两节课
Class Person{
Address address
}
Class Address{
String city
}
Run Code Online (Sandbox Code Playgroud)
在我的代码的某处,我正在做,
def person = Person.get(1)
def field = "address.city"
def city = person."${field}"
Run Code Online (Sandbox Code Playgroud)
我试图从人那里获取城市的行正在抛出groovy.lang.MissingPropertyException
如果我尝试使用gstring获取直接属性它可以工作,但上面给出的代码不起作用.
有帮助吗?
Groovy有一个GStrings的概念.我可以写这样的代码:
def greeting = 'Hello World'
println """This is my first program ${greeting}"""
Run Code Online (Sandbox Code Playgroud)
我可以从String中访问变量的值.
我怎么能用Python做到这一点?
- 谢谢
我试图找出Groovy如何将a char[]转换为Stringa GString.
例:
char[] pchar = ['p', 'a', 's', 's']
println "$pchar"
Run Code Online (Sandbox Code Playgroud)
结果:
通过
起初我假设它会在char [](http://groovy.codehaus.org/groovy-jdk/primitive-types/char [] .html#toString())上使用toString()方法.但运行以下代码的结果似乎暗示:
char[] pchar = ['p', 'a', 's', 's']
println "$pchar"
pchar.class.metaClass.toString = {->
"****"
}
println pchar.toString()
println "$pchar"
Run Code Online (Sandbox Code Playgroud)
结果:
通过
****
通过
我也试过压倒invokeMethod()试图搞清楚无济于事:
char[] pchar = ['p', 'a', 's', 's']
println "$pchar"
pchar.class.metaClass.toString = {->
"****"
}
pchar.class.metaClass.invokeMethod = {String methodName, Object arguments ->
println("Method called on ${delegate.class}: $methodName, $arguments")
def metaMethod = delegate.metaClass.getMetaMethod(methodName)
return …Run Code Online (Sandbox Code Playgroud) 嗨,我有一个填充运行时的字符串值,我想用它来构造另一个字符串.
static value= ''
static construct = "${-> value - '/'}"
Run Code Online (Sandbox Code Playgroud)
所以,当我值 ="/www.stackoverflow.com"时,构造等于"www.stackoverflow.com "
但是当我这样做的时候
static value= ''
static construct = {-> value - '/'}
Run Code Online (Sandbox Code Playgroud)
construct等于一些关闭名称.我想知道这是什么目的?为什么使用闭包,GString一切正常?为什么只使用闭合没有任何反应?
已编辑: 此方法调用的值已更改.
def someCoplmexMethod(){
value="/www.stackoverflow.com"
}
Run Code Online (Sandbox Code Playgroud) 由于Grails和Groovy中,单引号字符串是从GString的(双引号字符串允许$ {变量}值注射)不同的类,它是更有效的使用单引号,当正在使用的$ {变量}除?我猜测双引号的存在将需要解析普通的单引号字符串不需要的字符串.因此,我希望从寻找$ {}的额外时间中获得非常轻微的性能影响.
因此,除非使用双引号具有特定优势,否则通常有一个鼓励使用单引号的约定似乎是有益的.我是不是基地?
在我们的 Jenkinsfile 中,我们有很多参数(参数化构建),在这种情况下,我想检查每个参数是否被切换并对其采取行动。这些参数具有相似的名称,但以不同的小数结尾,因此我想对它们进行迭代以实现此目的。
我有类似的东西:
if ("${TEST_00}" == "true") { testTasksToRun.add(testsList[0]) }
if ("${TEST_01}" == "true") { testTasksToRun.add(testsList[1]) }
if ("${TEST_02}" == "true") { testTasksToRun.add(testsList[2]) }
if ("${TEST_03}" == "true") { testTasksToRun.add(testsList[3]) }
if ("${TEST_04}" == "true") { testTasksToRun.add(testsList[4]) }
if ("${TEST_05}" == "true") { testTasksToRun.add(testsList[5]) }
Run Code Online (Sandbox Code Playgroud)
但我想有类似的东西:
for(int i=0; i<testsList.size(); i++) {
if ("${TEST_0${i}}" == "true") {
testTasksToRun.add(testsList[i])
}
}
Run Code Online (Sandbox Code Playgroud)
我试图寻找解决方案并在 GroovyConsole 上进行试验,但没有设法让任何事情发挥作用。看起来它与“绑定”有关,但我对此并不熟悉。
我有一个以xml格式保存的word文档.在本文档中,有一些GString标签,如$ name.
在我的groovy代码中,我加载xml文件来替换这个GString标记,如下所示:
def file = new File ('myDocInXml.xml')
def name = 'myName'
file.eachLine { line ->
println line
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.GString标签不会被我的变量'name'替换.
谁能帮助我?
谢谢
我有以下问题,当我将GString传递给SQL.executeInsert时,文本变量不会被自动索引,'因此插入查询失败:
String value4fa = "I would like to get know"
int value4fb = 2
def query = "INSERT INTO TAB_A (F_A, F_B) VALUES (${value4fa}, ${value4fb})"
sql.executeInsert(query);
Run Code Online (Sandbox Code Playgroud)
如果我'自己放:
def query = "INSERT INTO TAB_A (F_A, F_B) VALUES ('${value4fa}', ${value4fb})"
Run Code Online (Sandbox Code Playgroud)
Groovy告诉我,我已经引入了一个安全漏洞,因为Groovy不能使用PreparedStatement来执行SQL查询.
任何人都可以解释我如何强制Groovy正确评估查询正文并准备变量?
我定义了以下变量:
def VAL1 = 'foo'
def VAL2 = 'bar'
def s2 = 'hello ${VAL1}, please have a ${VAL2}'
Run Code Online (Sandbox Code Playgroud)
使这种替换最简单的方法是什么?我如何构建GString s2并对其进行评估?(VALs和s2是从数据库加载的,这个代码片段仅用于演示我的问题.)
在为个人项目编程时,我发现当我将指针传递给一个函数时,它的值无法更改.例:
...
GString *buf = NULL;
buf = g_string_sized_new(64);
somefunc(buf, filename);
...
Run Code Online (Sandbox Code Playgroud)
和
void somefunc(GString *buf, gchar *filename)
{
buf = otherfunc(filename); //otherfunc() returns a GString *
}
Run Code Online (Sandbox Code Playgroud)
在观察调试器后我观察到当缓冲区内存分配运行时,则buf = 0x80b720和otherfunc()返回0x80b750.虽然缓冲区的值没有变化.所以我想问一下是否有人知道为什么会发生这种情况,以及这是否是malloc()的一般特征.换句话说,如果将malloc()调用返回的指针传递给函数,那么您是否可以在函数体内部或外部更改此值?