2012-05-14 2 views
0

배열의 항목이 문자열인지 여부를 확인하고 싶습니다. 비슷한 것 .include?역순 배열 포함?

나는 그 기능을 썼다. 그러나이 일 것이라고 확신한다.

다른 사람이 사용하는 방법을 제안 할 수 있습니까 동일한 코드를 달성하기 위해 적은?

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

지수는 truthy/falsy 값을 반환합니다, 그래서 이것은 아마 그것을 할 수있는 '깨끗한'방법입니다

$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

왜 정규식이 더 효율적입니까? – Radek

+1

@Radek : 정규식 엔진은'array'의 모든 요소를 ​​한 번에 볼 수 있으므로 더 큰 배열의 경우 더 빠를 수도 있습니다. –

1

난 그냥 같은 것을 할 것입니다. 나는 또한 포함시킬 것인가? 함수 정의의 끝에서 사용 방법과 결과를 더 명확하게하기 위해서입니다.

+0

코드가'if ($ goes_into_cron_comments.index {| item | params [ 'run']. downcase.include? (item)})'로 바뀌었고 배열에'correct' 문자열이 들어 있어도 항상 . 당신의 코드에서 ...'.include? (item)'... – 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