31 votes

À quoi servent les fonctions catch et throw en Ruby ?

Dans la plupart des autres langages, les instructions catch et throw font ce que les instructions begin, rescue et raise font en Ruby. Je sais que vous pouvez le faire avec ces deux instructions ...

catch :done do
  puts "I'm done."
end

if some_condition
  throw :done
end

Mais à quoi cela sert-il ? Quelqu'un peut-il me donner un exemple de l'utilité des instructions catch et throw en Ruby ?

34voto

bragboy Points 13615

Vous pouvez l'utiliser pour sortir des boucles imbriquées.

INFINITY = 1.0 / 0.0
catch (:done) do
  1.upto(INFINITY) do |i|
    1.upto(INFINITY) do |j|
      if some_condition
        throw :done
      end
    end
  end
end

Si vous aviez utilisé une instruction break ci-dessus, vous seriez sorti de la boucle interne. Mais si vous voulez sortir de la boucle imbriquée, alors ce catch/throw serait vraiment utile. Je l'ai utilisé aquí pour résoudre un des problèmes d'Euler.

21voto

Simone Carletti Points 77653

J'ai cherché un bon exemple pendant un certain temps, jusqu'à ce que je rencontre Sinatra. À mon avis, Sinatra expose un exemple très intéressant d'utilisation de la fonction catch .

Dans Sinatra, vous pouvez mettre fin immédiatement à une demande à tout moment en utilisant halt .

halt

Vous pouvez également spécifier le statut lors de l'arrêt...

halt 410

Ou le corps...

halt 'this will be the body'

Ou les deux...

halt 401, 'go away!'

La méthode d'arrêt est mis en œuvre en utilisant throw .

def halt(*response)
  response = response.first if response.length == 1
  throw :halt, response
end

y attrapé par le site invoke méthode.

Il existe plusieurs utilisations de :halt dans Sinatra. Vous pouvez lire le code source pour plus d'exemples.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X