2016-10-20 6 views
0

Aufruf Lets sagen, ich habe zwei Methoden:Rubin - iterieren und eine Reihe von Methoden

def hello 
'hello' 
end 

def world 
'world' 
end 

Jetzt habe ich diese Methoden in einer Weise, wie dies nennen wollen:

try_retry{ 
    hello 
} 
try_retry{ 
    world 
} 

nehmen try_retry ist Eine Methode, die den Codeblock wiederholt, wenn ein Fehler auftritt. Es gibt viele dieser Methoden, also ist es möglich, über die Blöcke zu iterieren? Etwas wie:

array_of_methods = [hello,world] 
array_of_methods.each do |method| 
    try_retry{ 
    method 
    } 
end 

das Problem ist, die Methoden auf dieser Linie ausgewertet erhalten:

array_of_methods = [hello,world] 

Antwort

1

Sie tun können

array_of_methods = [method(:hello), method(:world)] 

Und Sie können es nennen wie

array_of_methods.each { |m| m.call } 
+0

Hinweis: Mit dieser Antwort ist 'method (: hallo)' ein Objekt für die Methode 'hallo' und ruft die Methode nicht direkt auf. Das ist sehr schön, weil Sie mehr Möglichkeiten haben, was mit der Methode zu tun ist, aber wenn Sie nur die Methode aufrufen, ist die Verwendung von 'send' effizienter. –

0

Sagen wir, du hast t er Methoden hello und world. Wenn Sie diese Methoden aufrufen möchten, während über sie iterieren, können Sie es tun, als solche

['hello', 'world'].each do |m| 
    send(m) 
end 
+1

Methodennamen sind normalerweise Symbole. Außerdem müssen Sie 'send' in' try_retry {...} 'aufrufen, um das OP-Problem zu lösen. – Stefan

0

Je nach Herkunft dieser Reihe von Methodennamen können Sie nicht privat oder geschützten Methoden erlauben wollen so genannte bekommen public_send ermöglicht, dass nur öffentliche Methoden aufgerufen werden.

Verwandte Themen