2014-01-28 7 views
33

이 다중 행, 복합 조건 if 문을 Ruby에 쓰려면 어떻게해야합니까?Ruby에서 복합 다중 회선 조건을 작성하려면 어떻게해야합니까?

if ((aa != nil && self.prop1 == aa.decrypt) 
     || (bb != nil && self.prop2 == bb.decrypt) 
    ) && (self.id.nil? || self.id != id) 
    return true 
    end 

나는 Syntax error; unexpected tOROP을 얻고 있습니다.

자바에서 나는 그렇게, 짧은 대답은 운영자가 문의 일환으로 다음 줄을 읽기 계속 루비에게하기 위해 줄의 끝에서 할 필요가있다

if (
    ((aa != null && aa.prop1.equals(aa.decrypt())) 
    || (bb != null && bb.prop2.equals(bb.decrypt())) 
    ) 
    && (this.id != id) 
    ) { 

    return true; 
} 

답변

60

를 작성할 수 이 작동합니다 :

if ((aa != nil && self.prop1 == aa.decrypt) || 
    (bb != nil && self.prop2 == bb.decrypt)) && 
    (self.id.nil? || self.id != id) 
    return true 
end 

말했다되고, 당신은 아마 중복 검사를 입력 값에 따라 예외를 던지는 및 제거하여 논리를 감소시킬 수있다 (나는 당신의 변수가 어떻게 보일지에 대해 여기에 몇 가지 점프를 만들고 있어요, 그러나 당신은 아이디어를 얻는다.)

raise 'aa must support decrypt' unless aa.respond_to? :decrypt 
raise 'bb must support decrypt' unless bb.respond_to? :decrypt 
if prop1 == aa.decrypt || prop2 == bb.decrypt 
    if self.id != id 
    return true 
    end 
end 
+0

Ahh! 내가 참조. 그게 효과가 있었어. 실제로 루프에 있으므로 예외를 발생시키고 싶지는 않습니다. – Chloe

14

백 슬래시 문자로 공백을 이스케이프해야합니다.보기 싫지만 조건을 여러 줄로 나누려면 필요합니다. 그 중 하나 또는 이전 라인에 부울 연산자를 남겨주세요. 그래서 이들 중 하나를 작동합니다

if ((aa != nil && self.prop1 == aa.decrypt)\ 
     || (bb != nil && self.prop2 == bb.decrypt)\ 
    ) && (self.id.nil? || self.id != id) 
    return true 
    end 

또는 : 개인적으로

if ((aa != nil && self.prop1 == aa.decrypt) || 
     (bb != nil && self.prop2 == bb.decrypt)) && 
    (self.id.nil? || self.id != id) 
    return true 
    end 

나는 보통 자기 문서를 결정하고 무슨 방법으로 각각의 또는 모든 조건을 넣어하기로 결정 :

def everythings_cool? 
    ((aa != nil && self.prop1 == aa.decrypt) || 
      (bb != nil && self.prop2 == bb.decrypt)) && 
     (self.id.nil? || self.id != id) 
end 

그 다음 :

if everythings_cool? 
    # do stuff 
+0

나는 두 번째 방법을 좋아한다. 여러 위치에서 사용하지 않는 한 메서드를 추출하는 것을 좋아하지 않습니다. 그렇지 않으면 if 문을 돌아볼 때 수행중인 작업을 찾기 위해 변수를 전달하고 추적해야합니다. – Chloe

+2

나는 또한 물음표로 끝나는 자체 문서화 방법에서 다소 복잡한 부울 검사를 추출하는 것을 선호합니다. 정신을 향상시킵니다. – Epigene

관련 문제