的常規方法,如果事情是在一個列表是使用「在」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