2017-12-31 44 views
0

현재 정확한 흐름을 결정하기 위해 case 문을 사용하고 있습니다. 그것은 다음과 같습니다튜플을 루비 해시로 전달

case os 
    when 'windows' 
    # If Windows - Call code for WinRM connection 
    when 'redhat' 
    # If Redhat - Call code for SSH connection 
    if env == 'pci' 
     # Do stuff for PCI 
     exec_pci 
    else 
     # Do stuff for non PCI 
     exec_non_pci 
    end 
    else 
    # Raise some exception 
end 

그 해시/사전에 값 (들)을 찾기 위해 하나의 키를 사용하지만 내가 그것을 튜플 전달할 수있는 조회 해시 테이블이 설정 가능하다 알아? 여기에 몬스터가 원래의 else 절입니다 my_hash[(os, env)]하고 값을받을 것으로 예상 exec_pci

+1

질문이 명확하지 않습니다. 루비에는 튜플이 없습니다. 당신이 작성한 튜플 구현에 대해 이야기하고 있습니까? 그렇다면 코드를 보여주십시오. 타사 튜플 라이브러리에 대해 이야기하고 있습니까? 그렇다면 어느 것입니까? 어쨌든, 루비는 라이브러리가 언어의 구문과 의미를 변경하는 것을 허용하지 않으므로'(os, env)'는 단순히 매개 변수 목록이나 인수 목록의 일부가 아닌 이상 불법 구문입니다. –

+0

또한 예/아니오 질문은 "가능합니다"는 [너무] 적합하지 않습니다. 가능한 대답은 두 가지뿐입니다. "아니오"(귀하 또는 다른 사람에게 약간 도움이되지 않음) 또는 "예"(여전히 귀하 또는 다른 사람에게 약간 도움이되지 않음)입니다. –

+0

루비는 그렇게 할 수 없습니다. 하지만 난 당신이 자신의 튜플 클래스를 사용자 정의 할 수 있다고 생각 다음 키로 튜플 객체를 사용합니다. – Daniel

답변

3

처럼 반환 : 나는 다음을 부를 것이다

os = 'redhat' 
env = 'pci' 

가 :

필자는 다음과 같이 뭔가를 찾고 암호. 당신이 그것을 제거 할 수 있다면, 당신은 조회를 위해 해시를 만들 수 있습니다. 당신의 os'windows'의 경우, 예를 들어, envnil해야하므로 키 해시를 조회하는 것은, 정확한 일치를 요구하는

my_hash = { 
    ['windows', nil] => -> { exec_windows }, 
    ['redhat', 'pci'] => -> { exec_pci }, 
    ['redhat', 'non_pci'] => -> { exec_non_pci } 
} 

os, env = 'windows', nil 

my_hash[[os, env]].call 

주, 그렇지 않으면 당신은 NoMethodErrornilcall 이름있는 방법이 없습니다 당신을 말하는거야 . 당신은 그렇지 않으면 당신은 할 수있다, 다른주의해야 할 점은 당신이 작업 (예를 들어,이 exec_pci)를 호출하도록되어 같은 범위에 my_hash를 정의해야한다는 것입니다 Hash#fetch

my_hash.fetch([os, env]).call 

를 사용하여 조금 일찍 발생이 오류를 만들 수 있습니다 이러한 메소드를 올바르게 호출 할 수 없습니다.

+1

해시에 [Hash # default_proc] (https://docs.ruby-lang.org/en/2.4.0/Hash.html#method-i-default_proc)을 첨부하여 else 절을 ​​처리 할 수 ​​없습니까? ? –

+0

'else'가 여러 개 있으면 안됩니다. – Aetherus

+0

OP의 코드를주의 깊게 읽지 않았습니다. 이 질문은'env'에 가능한 값이 두 가지 밖에 없다는 것을 명시하고 있지 않습니다. 우리가 알다시피, 'env'의 가능한 값은 컴파일 타임에 알려지지 않을 수도 있습니다. OP는 'pci'또는 다른 것일 경우에만 우려됩니다. 또한,''windows ', nil''이 약간 이상하다고 생각하지 않습니까? –

0

다음과 같이하시는 것이 좋습니다.

doit 'windows' 
    #-> os = 'windows' 
doit 'windows', 'cat' 
    #-> os = 'windows' 
    #=> ArgumentError: ArgumentError 
doit 'redhat', 'pci' 
    #-> os = 'redhat' 
    #-> ssh = ["pci"] 
    #-> exec_non_pic called 
doit 'redhat', 'cat' 
    #-> os = 'redhat' 
    #-> ssh = ["cat"] 
    #-> exec_non_pic called 
doit 'redhat' 
    #-> os = 'redhat' 
    #-> ssh = [] 
    #=> ArgumentError: ArgumentError 
doit 'redhat', 'cat', 'dog' 
    #-> os = 'redhat' 
    #=> ssh = ["cat", "dog"] 
    #=> ArgumentError: ArgumentError 
doit 'cat' 
    #-> os != 'windows' and os != 'redhat' 
    #=> StandardError: StandardError 

def doit(os, *ssh) 
    case os 
    when 'windows' 
    puts "os = 'windows'" # remove when debugged 
    raise ArgumentError unless ssh.empty? 
    # Call code for WinRM connection 
    when 'redhat' 
    puts "os = 'redhat'" # remove when debugged 
    puts "ssh = #{ssh}" # remove when debugged 
    raise ArgumentError unless ssh.size == 1 
    # Call code for SSH connection 
    if ssh.first == 'pci' 
     # Do stuff for PCI 
     exec_pci 
    else 
     # Do stuff for non PCI 
     exec_non_pci 
    end 
    else 
    puts "os != 'windows' and os != 'redhat'" # remove when debugged 
    # Raise an exception 
    raise StandardError 
    end 
end 

def exec_pci 
    puts "exec_pic called" 
end 

def exec_non_pci 
    puts "exec_non_pic called" 
end 
exec_pci 상정하고 exec_non_pci 방법이 명시되지 않은 한 경우이다. 그들은 질문에 표시되지 않고 지역 변수 인 경우, 하나는

doit 'redhat', 'pci', exec_pic 

argdoit('windows', arg)를 호출하기 위해, 예를 들어, 호출 될 수 있도록하는 방법을 doit 수정하는 인공 값을해야합니다 (예를 들어, nil) 사용되지 않는 것은 내 의견으로는 나쁜 프로그래밍 습관이다.

관련 문제