"Alvaro Perez" <alvaro.pmartinez / gmail.com> wrote in message 
news:8b39ce45165efee679037915d6b29bb0 / ruby-forum.com...
> Hi there,
>
> something that I think should not be very difficult, but i'm struggling
> with:
>
>  def find(name, where)
>      for father in where
>         if (father.name==name) then
>             found = thing
>             break
>         else
>             find(name, father.children)
>         end
>      end
>      found
>  end
>
> I have an array with parent objects, some of them have children. I want
> to find an object with the same name and return in, otherwise nil.
>
> The problem is that, once I start searching inside the children of some
> father, and I found what I'm looking for, I break the loop inside (array
> father.children). But then the search continues in the level above. I
> would like to break the complete search. How can it be done?

    I don't understand, exactly, what you're doing but there are some things 
that are obviously wrong with your code and some techniques you should 
probably know to implement what you're doing.
    First of all, have you tested your own code?  Your find() method doesn't 
even store the value of its recursive call.  It might still work if that 
recursive call is the last thing your method does but you explicitly 
evaluate the variable "found," ensuring that the recursed value is never 
returned since it can never be the last thing done.
    Secondly, using literal for loops is very pythonic and, thus, un-ruby 
like.  Wouldn't you rather where.each through elements?
    Finally, there are many different ways to solve your problem.  If where 
is enumerable, you can use the find method:

def weird_find(name, container)
    container.find do |father|
        if father.name == name
            father  # Is this what you're looking for?
        else
            weird_find(name, father.children)
        end
    end
end

    ...this code is untested but it should work.  If "container" has no 
find() method, just use .each and break, instead.
    Something cool you could use is throw.  This is simple enough to not 
need it but you could just excercise your ruby-fu:

def recursive_find(name, container)
    container.each do |father|
        if father.name == name
            throw :found, father  # The second parameter should be catch's 
return value...
        else
            recursive_find(name, father.children)
        end
    end
end

def weird_find(name, container)
    catch :found { recursive_find(name, container) }
end

    ...this is also untested.  catch returns a value, here, so weird_find() 
will return what catch catches...
    Good luck with your problem...