2017-12-31 246 views
0

現在、ケース・ステートメントを使用して正しいフローを判断しています。 それは次のようになります。タプルをルビのハッシュに渡す

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

あなたの質問は不明です。 Rubyにはタプルはありません。自分で書いたタプルの実装について話していますか?はいの場合は、コードを表示してください。サードパーティのタプルライブラリについて話していますか?はいの場合はどちらですか?どちらの場合でも、Rubyはライブラリが構文と言語の意味を変更することを許さないので、 '(os、env)'は単に(パラメータリストや引数リストの一部でない限り)不正な構文です。 –

+0

また、「そうすることができる」のようなYes/Noの質問は、[so]の本当に悪いフィットです。可能な答えは2つだけです:「いいえ」(あなたや他の誰かに少し役に立たない)または「はい」(それでもあなたや他の人には少し役に立たない)です。 –

+0

ルビーはそれを行うことはできません。しかし、私はあなた自身のTupleクラスをカスタマイズしてから、タプルオブジェクトをキーとして使うことができると思います。 – Daniel

答えて

3

のように返さ:私は次のことを呼ぶだろう

os = 'redhat' 
env = 'pci' 

は:

イムは、このような何かを探してコード。あなたがそれを取り除くことができれば、検索のためにハッシュを作ることができます。あなたのos'windows'であれば、たとえば、envnilでなければならないので、キーでハッシュを照会すると、そうでない場合は、あなたがNoMethodErrornilcallという名前のメソッドを持っていないことを言ってますよ、完全一致が必要であることを

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 

注意。このエラーは、あなたがそうでなければ、他の警告は、あなたが仕事(例えば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'には2つの値しか指定できないことに注意してください。私たちが知っている限り、 'env'の可能な値はコンパイル時にも知りません。 OPが 'pci'か何か他のものである場合にだけ、OPは心配します。また、 '' windows '、nil' 'は少しklutzyだと思いませんか? –

0

次のようにすることをお勧めします。

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 

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 

exec_pciを仮定し、exec_non_pciは暗黙の方法ですしている場合。彼らは代わりに質問には示されていないローカル変数であれば、arg人工値(例えば、nilあるdoit('windows', arg)を呼び出すには、例えば、

doit 'redhat', 'pci', exec_pic 

と呼ばれることになるように、一つは方法doitを変更する必要があります)は、私の意見では悪いプログラミングの練習では使用されていません。

関連する問題