2010-01-29 3 views
1

인덱스 메서드를 사용하여 특정 변수를 사용하여 값이 존재하는지 여부를 찾고 해당 변수가 존재하지 않으면 다른 변수를 시도합니다. 이런 작은 (아래에 3 행)Ruby : "OR"을 사용하여 "index"메서드 사용

a = [ "a", "b", "c" ] 
a.index("b") #=> 1 
a.index("z" or "y" or "x" or "b") #=> 1 

"Z"어레이에서 발견되지 않으면, "Y"를 시도해 ..meaning; y가 발견되지 않으면 x를 시도하십시오. x가 발견되지 않으면 시도하십시오.

어떻게 올바르게 처리 할 수 ​​있습니까?

답변

2

TIMTOWTDI. 하지만 Array # inject를 사용하는 것을 선호합니다.

%w(x y z b).inject(nil) { |i, e| i or a.index(e) } #=> 1 

그리고 의사 코드와 비슷한 방식으로이를 수행하는 또 다른 방법이 있습니다.

class String 
    def | other 
    ->(e) { self==e || other==e } 
    end 
end 

class Proc 
    def | other 
    ->(e) { self.call(e) || other==e } 
    end 
end 

a.index(&('x' | 'y' | 'z' | 'b')) #=> 1 
+0

감사합니다. 정말 큰 도움을 주셔서 감사합니다 :) 정말 설명을 해줘서 고마워. – andy

+0

은'->'람다 구문에 대해 루비 1.9가 필요합니다. –

+0

이전 버전의 불쾌한 버그를 수정했습니다. '% '(xyz) .index (& ('foo '|'bar '|'zzz '|'b '))'는'2'로 평가되었습니다. – nonowarn

2

최종 목표에 따라 다릅니다. 그냥 a가 포함되어 있는지 확인하려는 경우 z, y, x 또는 b, 당신은이 작업을 수행 할 수 있습니다

(a & %w{z y x b}).length > 0 # gives true if a contains z, y, x and/or b. 

을 우리는 일부 공유가 포함 된 교집합가있는 경우보고있다하고있는 원하는 양의 세트를 가진 요소를 찾은 다음 해당 요소가 있는지 테스트합니다.

+0

감사합니다. 그것은 완벽하게 작동합니다. 고마워요. :) – andy

관련 문제