2017-05-24 12 views
1

case 문을 정규식에서 전달 된 두 매개 변수를 고려하는 방법을 찾으려고합니다.매개 변수가 케이스에 전달 된 조건부 Ruby 사례 문을 작성하려면 어떻게해야합니까?

내 정규식 예는 다음과 같습니다

(/^(?:a|an|the) (RoleA|RoleB) 시도 |role_type, record_type|를 수행 (New|Updated) Record$/)에 액세스 할 때.

저는 case 성명을 가지고 있습니다. 지금은 역할 유형에 대해서만 설명하지만, role_typerecord_type에 대해서도 어떻게해야합니까?

내 목표는 레코드 유형이 "신규"또는 "업데이트 됨"일 때 역할 A가 다른 끝점 세트로 보내지는 것을 테스트하는 것입니다. 그리고 "새로 만들기"에서 전달할 때 역할 B가 다른 끝점 집합으로 지정되기를 원합니다. "및"업데이트 됨 ". 동일한 엔드 포인트로 전달 된 경우 record_type에 대한 사례 설명만으로 충분합니다.

은 내가 지금있는 것은 :

case record_type 
    when 'New' 
    <do something> 
    when 'Updated' 
    <do something> 
end 

나는 역할이 무엇인지에 따라 동작을 전환하고 싶습니다. 이 작동하지 않았다 :

case record_type && role_type == 'RoleA' 
    when 'New' 
    <do something> 
    when 'Updated' 
    <do something> 
end 

case record_type && role_type == 'RoleB' 
    when 'New' 
    <do something> 
    when 'Updated' 
    <do something> 
end 

이 코드는 건너 뛴다. 나는이 루비가 어떤 명령문을 사용하는지 혼란 스럽다고 가정하고있다.

답변

1
루비 방금 만 2가지 경우이 "혼란"되지

:

case record_type && role_type == 'RoleA' # true or false 

record_type && role_type == 'RoleA' 때문 만 true 또는 좀 더 당신이 찾고있는 생각 무엇을 false로 평가 것입니다 :

case role_type 
    when 'RoleA' 
    case record_type 
     when 'New' 
     #do something 
     when 'Updated' 
     #do something 
    end 
when 'RoleB' 
    case record_type 
     when 'New' 
     #do something 
     when 'Updated' 
     #do something 
    end 
end 

그게 내가 리팩토링이 더 간단한 무언가로 가능한지 여부를 조사하는 것이 좋습니다 것이라고 말했다.

def new_record(role_type) 
    if role_type == 'RoleA' 
    #do something 
    elsif role_type == 'RoleB' 
    #do something 
    end 
end 

def updated_record(role_type) 
    if role_type == 'RoleA' 
    #do something 
    elsif role_type == 'RoleB' 
    #do something 
    end 
end 

acceptable_record_types = ['New','Updated'] 
public_send("#{record_type.downcase}_record",role_type) if acceptable_record_types.include?(record_type) 

이것은 유사점을 이해하면 더 리팩토링 될 수 있습니다 #do something

+0

이 방법도 사용할 수 있습니다. 나는 혼란스러운 사람이었던 것 같다. 그리고 나는 이것을 위해 방법을 만드는 것에 대해 내가 무엇을 할 수 있는지 확실히 알 것이다. 감사! – qaminded

2

case에 "인수"를 전달할 수 없습니다. case 뒤에 나오는 첫 번째 항목은 일치시킬 개체를 반환하는 식이므로 true 또는 false 중 하나를 반환합니다. if 표현식 안에 모두 넣거나 두 객체를 배열에 배치하고 전체 배열에 일치시킬 수 있습니다.

case [record_type, role_type] 
when ['New', 'RoleA'] 
    ... 
when ['New', 'RoleB'] 
    ... 
when ['Updated', 'RoleA'] 
    ... 
when ['Updated', 'RoleB'] 
    ... 
end 
+0

감사합니다! 이제 && 연산자가 해결하는 방법에 대해 더 자세히 설명합니다. – qaminded