2012-05-14 37 views
0

我想查從陣列中的任何項目是否是字符串的一部分。像.include?反向包含數組?

我寫了一個函數,但我相信會有一個更簡單的方法

可能有人建議我如何使用更少的代碼來實現相同的

$goes_into_cron_comments=["Edumate_upgrade","login"].map!{|item| item.downcase} 
params={} 
params['run']="login_ldap" 

def contains(array,string) 
     array.each{|item| 
      if string.include?(string) 
       return true 
      end 
     } 
     return false 
end 
#if ($goes_into_cron_comments.include?(params['run'].downcase)) #original condition 
if (contains($goes_into_cron_comments,params['run'].downcase)) 
    puts "contains" 
else 
    puts "doesn't contain" 
end 
+0

類似的問題:[找出發生在一個小串在大名單的話(HTTP: //stackoverflow.com/q/4859733/405017)。 – Phrogz

回答

3

有事情可以做,那會更好。你可以使用Enumerable#any?而不是手工迭代:

array.any? { |item| string.include?(item) } 

或者你可以使用Regexp.union

string =~ Regexp.union(array) 
# or if you want a true boolean 
!!(string =~ Regexp.union(array)) 
!(string =~ Regexp.union(array)).nil? 
+1

+1來到這裏爲更高效的正則表達式的答案,讓多餘的滿足,因爲union'的'使用。 – Phrogz

+0

爲什麼regex更高效? – Radek

+1

@Radek:正則表達式引擎可以在array'的'所有元素的外觀一下子讓它可以* *是更大的陣列更快。 –

1

我只想做這樣的事情:

def contains?(array,string) 
    array.index{|item| string.include?(item)} 
end 

指數將返回truthy/falsy值,所以這可能是「乾淨」的方式來做到這一點。我還會包括?在函數定義的最後,只是爲了更清楚地說明它應該如何使用以及期望的結果。

+0

我改變了我的代碼,如果'($ goes_into_cron_comments.index {|項目|。PARAMS [「跑」] downcase.include(項目)?})',我總是得到真正的不管,如果數組包含'correct'串。在你的代碼應該是...'.INCLUDE?(項目)'... – Radek

+0

是啊,對不起,我沒有該位從你的例子:) – ctide

+0

所以,這又是我;-) – Radek

2

試試這個:

str = 'hey, this is a string' 
arr = %w{one hey may} 

arr.any? { |el| str.include? el } 
=> true 
+0

工程進展順利改變。謝謝。 – Radek