2017-12-29 27 views
2

私はこの一連のコマンドを実行し、MAX_RETRIESに達するまで再試行を続けます。私は、これを何度も何度も何度も繰り返したいとは思わない。それを行うためのエレガントな方法はありますか?関数にコードを渡すにはどうすればよいですか?

retries = 0 
    ex = true 
    MAX_RETRIES = 10 

    while(retries <= MAX_RETRIES and ex) 
     begin 
      #MY CODE HERE 
      ex = false 
     rescue 
      ex = true 
     end 
     retries = retries + 1 

    end 

これはなんですか?

execute_with_retries do 
    #CODE HERE 
end 

execute_with_retries do 
    #DIFFERENT CODE HERE 
end 

答えて

2

私はあなたの変数の一つと改名し、here理由を読むことができる機能を定義し、ブロック

def execute_with_retries 
    retries = 0 
    ex = true 
    max_retries = 10 

    while(retries <= max_retries and ex) 
    begin 
     yield 
     ex = false 
    rescue 
     ex = true 
    end 
    retries = retries + 1 
    end 
end 

execute_with_retries { puts "hello" } 
execute_with_retries { puts 1/0 } 

を実行します。 Rubyにはこのようなものがあり、それについてはhereを読むことができます。

+0

私はこれをどのように呼ぶかの例を教えてもらえますか? –

+0

'execute_with_retries {puts" hello "}'または 'execute_with_retries {puts 1/0}'です。メソッドの終わりに試行回数でprint文を追加する – Ursus

0
MAX_RETRIES = 10 

def execute_with_retries(meth) 
    retries = 0 
    ex = true 
    while(retries <= MAX_RETRIES and ex) 
     begin 
     public_send(meth) 
     ex = false 
     rescue 
     ex = true 
     end 
     retries = retries + 1 
    end 
    retries 
end 

require 'time.h' 

def meth 
    sleep(1) 
    puts "Time.now in m = #{Time.now}" 
    puts Time.now - @start < 5 ? "cat"/9 : "dog" 
end 

@start = Time.now 
    #=> 2017-12-30 13:39:20 -0800 
execute_with_retries(:meth) 

Time.now in m = 2017-12-30 13:39:21 -0800 
Time.now in m = 2017-12-30 13:39:22 -0800 
Time.now in m = 2017-12-30 13:39:23 -0800 
Time.now in m = 2017-12-30 13:39:24 -0800 
Time.now in m = 2017-12-30 13:39:25 -0800 
"dog" 
    #=> 5 
関連する問題