2016-07-29 6 views
0

その検証が、私はそれは、例えば、呼び出されたメソッドに戻りたい失敗した場合、私は、検証のための方法を使用するプログラムを持っている:これが実行されると呼び出し元のメソッドに戻るには?

def obtain_pokemon_name 
    print 'Enter Pokemon: ' 
    pokemon = gets.chomp.capitalize 
    obtain_basic_attack(pokemon) 
end 

def obtain_basic_attack(poke) 
    print 'Enter basic attack: ' 
    basic_attack = gets.chomp.downcase 
    check_attacks(poke, basic_attack) 
    obtain_spec_attack(poke) 
end 

def obtain_spec_attack(poke) 
    print 'Enter special attack: ' 
    spec_attack = gets.chomp.downcase 
    check_attacks(poke, spec_attack) 
end 

def check_attacks(pokemon, attack) 
    if POKEMON_ATTACKS[pokemon][attack] == nil 
    puts "#{attack} is not one of #{pokemon}'s attacks, try again.." 
    return # to where this function was called 
    else 
    attack 
    end 
end 

begin 
    obtain_pokemon_name 
rescue => e 
    puts "Failed with error code: #{e}" 
end 

Enter Pokemon: arbok 
Enter basic attack: eat 
eat is not one of Arbok's attacks, try again.. 
Enter special attack: test 
test is not one of Arbok's attacks, try again.. 

アタックリスト:

POKEMON_ATTACKS = { 
    'Bulbasaur' => {'tackle' => 10.9, 'vine whip' => 15.4, 'power whip' => 21.4, 'seed bomb' => 12.5, 'sludge bomb' => 19.2}, 
    'Ivysaur' => {'razor leaf' => 10.3, 'vine whip' => 15.4, 'power whip' => 21.4, 'sludge bomb' => 19.2, 'solar beam' => 13.3}, 
    'Kakuna' => {'bug bite' => 13.3, 'poison sting' => 10.3, 'struggle' => 8.8}, 
    'Beedrill' => {'bug bite' => 13.3, 'poison jab' => 14.3, 'aerial ace' => 8.6, 'sludge bomb' => 19.2, 'x-scissor' => 14.3}, 
    'Pidgey' => {'quick attack' => 7.5, 'tackle' => 10.9, 'aerial ace' => 8.6, 'air cutter' => 7.6, 'twister' => 5.6}, 
    'Ekans' => {'acid' => 9.5, 'poison sting' => 10.3, 'gunk shot' => 20.0, 'sludge bomb' => 19.2, 'wrap' => 3.8}, 
    'Arbok' => {'acid' => 9.5, 'bite' => 12.0, 'dark pulse' => 12.9, 'gunk shot' => 20.0, 'sludge wave' => 17.6}, 
} 

だから私の質問私は、呼び出し元のメソッドに戻って返すことができますどのような攻撃は、データに存在しない場合、ありますか?したがって、例えばarbokと呼び、攻撃がtackleであれば、それはハッシュに存在しません。どうすればobtain_basic_attack(poke)メソッドに戻りますか?右ここ

+0

再帰を見てみることをお勧めします。ここには良いアナロジーがあります:http://stackoverflow.com/questions/717725/understanding-recursion – Un3qual

答えて

2

puts "#{attack} is not one of #{pokemon}'s attacks, try again.." 
    return # to where this function was called 

あなたは再び元のメソッドを呼び出す必要があります。あなたが代わりにobtain_spec_attackにこのロジックを追加することができ、すなわち

if POKEMON_ATTACKS[pokemon][attack] == nil 
    puts "#{attack} is not one of #{pokemon}'s attacks, try again.." 
    return obtain_spec_attack(poke) 

def obtain_spec_attack(poke) 
    loop do 
    print 'Enter special attack: ' 
    spec_attack = gets.chomp.downcase 
    attack_found = check_attacks(poke, spec_attack) 
    if attack_found 
     break attack_found # this will return attack_found from the loop 
    else 
     puts "attack not found" 
    end 
    end 
end 

編集再びあなたの質問を見て

、私はあなたがメソッドの倍数に戻りたい実現しますレベルアップ。あなたは、私がすでに概説きたアプローチを使用して、または代わりに救助を使用することができます。

def obtain_basic_attack(poke) 
    begin 
    print 'Enter basic attack: ' 
    basic_attack = gets.chomp.downcase 
    check_attacks(poke, basic_attack) 
    obtain_spec_attack(poke) 
    rescue AttackNotFoundError 
    retry # runs the 'begin' block again 
    end 
end 

def obtain_spec_attack(poke) 
    print 'Enter special attack: ' 
    spec_attack = gets.chomp.downcase 
    check_attacks(poke, spec_attack) 
end 

def check_attacks(pokemon, attack) 
    if POKEMON_ATTACKS[pokemon][attack] == nil 
    puts "#{attack} is not one of #{pokemon}'s attacks, try again.." 
    raise AttackNotFoundError 
    else 
    attack 
    end 
end 

AttackNotFoundErrorのようなカスタムエラーを使用するためには、どこかのエラークラスを定義する必要があります:

class AttackNotFoundError < StandardError; end 

ます実際にはraise StandardErrorのようなエラーを使用することができますが、救助しているエラーを制限して、関係のないエラーを救済しないようにしてください。

+0

コードを見ると、複数の呼び出しメソッドがあります。しかし、ループはおそらく – Rubyist

+0

あなたが救助を使用することもできます動作します。私はそれのための例を追加します。 –

+0

これは天才的なアイデアです!私は救助条項についても考えなかった、ありがとう! – Rubyist

関連する問題