次のようにすることをお勧めします。
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
を変更する必要があります)は、私の意見では悪いプログラミングの練習では使用されていません。
あなたの質問は不明です。 Rubyにはタプルはありません。自分で書いたタプルの実装について話していますか?はいの場合は、コードを表示してください。サードパーティのタプルライブラリについて話していますか?はいの場合はどちらですか?どちらの場合でも、Rubyはライブラリが構文と言語の意味を変更することを許さないので、 '(os、env)'は単に(パラメータリストや引数リストの一部でない限り)不正な構文です。 –
また、「そうすることができる」のようなYes/Noの質問は、[so]の本当に悪いフィットです。可能な答えは2つだけです:「いいえ」(あなたや他の誰かに少し役に立たない)または「はい」(それでもあなたや他の人には少し役に立たない)です。 –
ルビーはそれを行うことはできません。しかし、私はあなた自身のTupleクラスをカスタマイズしてから、タプルオブジェクトをキーとして使うことができると思います。 – Daniel