代码之家  ›  专栏  ›  技术社区  ›  MadHatter

带有GString值的ArrayList上的Groovy“inpsect()”

  •  0
  • MadHatter  · 技术社区  · 3 年前

    有一项工作将每天运行,以收集有关詹金斯的一些信息。
    对于调试,我将打印一个ArrayList到Jenkins控制台,以便进行可能的进一步调试。
    所以我跑了 inspect() 打印它,却发现它没有按预期工作。
    如果数组的所有元素和映射的键/值都被引用,我可以直接将输出复制粘贴到其他地方进行调试。

    简短演示:

    // Code
    def hz = "3.90GHz"
    def info = [["CPU": "CPU @ ${hz}"], ['HOST_OS':"Debian"]]
    println(info.inspect())
    
    // Output
    [['CPU':CPU @ 3.90GHz], ['HOST_OS':'Debian']]
    

    我发现“CPU”的值没有被引用 。 我的当前修复程序(添加 toString() 到GString):

    // Code
    def hz = "3.90GHz"
    def info = [["CPU": "CPU @ ${hz}".toString()], ['HOST_OS':"Debian"]]
    println(info.inspect())
    
    // Output
    [['CPU':'CPU @ 3.90GHz'], ['HOST_OS':'Debian']]
    

    我有两个问题:

    1. 检查() 似乎对GString不太满意,这是意料之中的事,还是一个bug?从 InvokerHelper 类,运行 检查() 在“GString”上,它将运行 return arguments.toString(); ,所以没有引号。
    2. 除了添加 toString() 到GString?

    提前谢谢。

    0 回复  |  直到 3 年前
        1
  •  0
  •   MadHatter    3 年前

    感谢@daggett提供的信息,了解groovy 3.x和4.x的不同之处 inspect() 方法。
    在3.0.11中,在InvokerHelper类中,它只检查String,不检查GString:

    if (arguments instanceof String) {
        // xxx
    }
    try {
        return arguments.toString();
    } catch (RuntimeException ex) {
        // xxx
    } catch (Exception ex) {
        // xxx
    }
    

    在FormatHelper类的4.0.2中,它检查 CharSequence 它同时包含String和GString:

    String DQ = "\"";
    if (arguments instanceof CharSequence) {
        String arg = escapeBackslashes ? escapeBackslashes(arguments.toString()) : arguments.toString();
        if (arguments instanceof String) {
            if (!inspect) return arg;
            return !escapeBackslashes && multiline(arg) ? "'''" + arg + "'''" : SQ + arg.replace(SQ, "\\'") + SQ;
        }
        if (!inspect) return arg;
        return !escapeBackslashes && multiline(arg) ? "\"\"\"" + arg + "\"\"\"" : DQ + arg.replace(DQ, "\\\"") + DQ;
    }
    

    总的来说,我认为我们可以将其视为3.0.11中的一个bug 检查() ,并且该错误在4.0.2中不存在。

    推荐文章