groovy开关语句中的列表匹配

groovy开关语句中的列表匹配,groovy,Groovy,在groovy中有没有一种方法可以实现类似的功能 def list1 = ['trs', 'file.xlsx', 'xxx'] def list2 = ['rls', 'file.xml', 'yyy'] def switchCheck(list) { switch (list) { case ['trs', /* matches pattern *.xlsx */ , /* any value */]: println "trs messa

groovy
中有没有一种方法可以实现类似的功能

def list1 = ['trs', 'file.xlsx', 'xxx']
def list2 = ['rls', 'file.xml', 'yyy']

def switchCheck(list) {
    switch (list) {
        case ['trs',  /* matches pattern *.xlsx */ , /* any value */]:
            println "trs message"
            break
        case ['rls', /* matches pattern *.xml */ , /* any value */]:
            println "rls message"
            break
        default: 
            println "no match"
            break
    }
}

switchCheck(list1)
switchCheck(list2)

我想检查switch语句中的列表数据,其中一些字段无关紧要,而其他字段应该匹配某个模式(例如以
*.xlsx
.xml
结尾)。

我只是创建了一个演示示例,因为monkey patch是邪恶的。 您可以在运行时修改

isCase
是groovy在switch语句中调用时的方法。(与Java不同)

就这样打电话吧:

    ... // You don't need to modify switchCheck method.
    def list2 = ['rls', 'file.xml', 'yyy']
List.metaClass.isCase = { Object switchValue ->
    if (!switchValue in List && switchValue.size() == 3) {
        false
    } else {
        switchValue.first() == delegate.first() && (switchValue[1]) in ~(createRegexFromGlob(delegate[1]))
    }

}
switchCheck(list1)

createRegexFromGlob是从中复制的。

我只是创建了一个演示示例,因为monkey补丁是邪恶的。 您可以在运行时修改

isCase
是groovy在switch语句中调用时的方法。(与Java不同)

就这样打电话吧:

    ... // You don't need to modify switchCheck method.
    def list2 = ['rls', 'file.xml', 'yyy']
List.metaClass.isCase = { Object switchValue ->
    if (!switchValue in List && switchValue.size() == 3) {
        false
    } else {
        switchValue.first() == delegate.first() && (switchValue[1]) in ~(createRegexFromGlob(delegate[1]))
    }

}
switchCheck(list1)

createRegexFromGlob是从中复制的。

检查正则表达式和列表。@Rao:实际上它不是正则表达式,它是全局模式。所以基本上我需要像
['trs',~/match extension/,~/match any/]
?检查正则表达式和列表。@Rao:实际上它不是正则表达式,它是全局模式。所以基本上我需要像
['trs',~/match extension/,~/match any/]
?我使用原始正则表达式而不是glob没有问题。我只想为
列表
案例创建一个奇特的一行程序,然后只需使用
~(delegate[1])
而不是
~(createRegexFromGlob(delegate[1])
,所以
['trs',~/xlsx/,~/*/]
something?@user1432980如果你使用orgin版本的
isCase
它总是调用
包含
语义。@user1432980你总是可以修改
isCase
来满足你自己的需要。monkey patch的缺点是,如果代码的其他部分使用
isCase
,可能会导致不想要的行为。我对你没有问题使用原始正则表达式代替glob。我只想为
列表
案例创建一个漂亮的一行代码,然后使用
~(delegate[1])
代替
~(createRegexFromGlob(delegate[1])
,所以
['trs',~/xlsx/,~/*/]
something?@user1432980如果您使用orgin版本
isCase
它总是调用
包含
语义。@user1432980您总是可以修改
isCase
以满足您自己的需要。monkey patch的缺点是,如果代码的其他部分使用
isCase
,可能会导致不必要的行为。