Skip to content

Instantly share code, notes, and snippets.

@rwjblue
Created December 5, 2012 20:39
Show Gist options
  • Select an option

  • Save rwjblue/4219290 to your computer and use it in GitHub Desktop.

Select an option

Save rwjblue/4219290 to your computer and use it in GitHub Desktop.
Using caller to Prevent Recursion in Ruby
# Inspired by blog post at: http://www.codebenders.com/code-cat/preventing-recursion-in-ruby/
module RecursionHelper
def prevent_recursion(method_name)
original = instance_method(method_name)
define_method(method_name) do |*args|
return if caller.any?{|c| c =~ /`#{method_name}'\z/}
original.bind(self).call(*args)
end
end
end
class RecursiveX
def foo
bar
"foo done"
end
def bar
foo
end
end
RecursiveX.new.foo rescue $! # => #<SystemStackError: stack level too deep>
require_relative 'recursion_helper'
class RecursiveXWithRecursionPrevention
extend RecursionHelper
def foo
bar
"foo done"
end
prevent_recursion :foo
def bar
foo
end
end
puts RecursiveXWithRecursionPrevention.new.foo # => "foo done"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment