的常规方法,如果事情是在一个列表是使用“在”Groovy中没有收集
if('b' in ['a','b','c'])
但是你怎么很好看,如果事情是不是一个集合中?
if(!('g' in ['a','b','c']))
似乎凌乱和“!”隐藏在随便的一瞥中。有没有更习惯性的常规方式来做到这一点?
谢谢!
的常规方法,如果事情是在一个列表是使用“在”Groovy中没有收集
if('b' in ['a','b','c'])
但是你怎么很好看,如果事情是不是一个集合中?
if(!('g' in ['a','b','c']))
似乎凌乱和“!”隐藏在随便的一瞥中。有没有更习惯性的常规方式来做到这一点?
谢谢!
不幸的是,我认为没有not in
漂亮的语法。但是你可以使用一个辅助变量,以使其更易于阅读:
def isMagicChar = ch in ['a', 'b', 'c']
if (!isMagicChar) ...
或者说,在这种情况下,你可以使用正则表达式:)
if (ch !=~ /[abc]/) ...
另一种方式来写它与contains
,例如
if (!['a', 'b', 'c'].contains('b'))
它以一个方法调用替换运算符的代价节省了括号的额外级别。
更可读,我不知道:
assert ['a','b','c'].any{it == 'b'}
assert ['a','b','c'].every{it != 'g'}
对于示例:
if (['a','b','c'].every{it != 'g'})
几个月前,我提出了一个new operator overloading ! (not operator)。现在,也许你可以使用任何奇数感叹词)
if(!!!('g' in ['a','b','c']))
在你的链接,该Codehaus的Groovy项目经理说:“你总是可以使用一些expando元类技巧或者AST转换来添加那些isNot方法。”现在,如果他只写了“我将使用一些expando元类别技巧或AST转换,在下一个Codehaus Groovy版本中添加isNot方法”。那我们就不会有问题了。 – 2011-12-17 00:30:36
if(!!! ['a','b','c']))中的'g') - 读作“如果g真的不在此列表中” – JesusFreke 2012-10-30 03:46:04
据Grails的文档有关创建标准here,你可以使用这样的事情:
not {'in'("age",[18..65])}
在这个例子中,你有一个属性名为"age"
,并且您想获取不在18和65之间的行。当然,[18..65]
部分可以用您需要的任何值或范围列表替换。
您可以添加新的功能:
Object.metaClass.notIn = { Object collection ->
!(delegate in collection)
}
assert "2".notIn(['1', '2q', '3'])
assert !"2".notIn(['1', '2', '3'])
assert 2.notIn([1, 3])
assert !2.notIn([1, 2, 3])
assert 2.notIn([1: 'a', 3: 'b'])
assert !2.notIn([1: 'a', 2: 'b'])
仍然会将`not`远离`contains`,因此很容易一眼就错过:/ – 2014-04-18 14:52:23