2010-02-18 46 views

回答

12

如果你想在一般情況下, 視頻後面跟着一個數字沒有明確列出所有有一對夫婦從Enumerable方法,你可以結合正則表達式使用的組合。

hash.keys是從hash^video\d$匹配的視頻,後面跟着一位數字。

# true if the block returns true for any element  
hash.keys.any? { |k| k.match(/^video\d$/ } 

# grep returns an array of the matching elements 
hash.keys.grep(/^video\d$/).size > 0 

grep也將讓你捕捉匹配鍵(S),如果你需要的信息,爲您的代碼的下位如

if (matched_keys = hash.keys.grep(/^video\d$/)).size > 0 
    puts "Matching keys #{matched_keys.inspect}" 

此外,如果我們正在尋找關鍵的前綴是一個變量,而不是硬編碼字符串,我們可以做線沿線的東西:

prefix = 'video' 
# use an interpolated string, note the need to escape the 
# \ in \d 
hash.keys.any? { |k| k.match("^#{prefix}\\d$") } 
+0

hash.keys.any?(BLK)是這個完美的解決方案。可以在塊檢查幾乎任何條件下,一個字符串是否具有一定的結構({| K | k.match(/ ^視頻\ d $ /} ),某一類的一個對象是否是一個鍵({| K | k.is_a(數字)}),... – severin 2010-02-18 09:19:11

+0

@mikej:我喜歡你解釋一切的方式......請你也加入到你的答案代碼會是什麼樣子,如果我們使用的變量名稱,而不是實際的字符串「視頻」?謝謝 – Radek 2010-02-18 09:46:01

+0

@Radek更新的答案,以顯示其中前綴是一個可變的情況。希望這是你心目中的那種東西。 – mikej 2010-02-18 11:45:10

6

一種可能性:

hash.values_at(:a, :b, :c, :x).compact.length > 1 
+0

@DigitalRoss:其中:A ,:b ect將是視頻,視頻1等? – Radek 2010-02-18 06:35:57

+0

權,並在某些時候(1.9?)陣列有一個'abbrev'方法,確實正是你想要的。我認爲這會去像'hash.keys.abbrev「video'' – DigitalRoss 2010-02-18 07:13:55