On Feb 4, 2006, at 3:50 PM, Dave Howell wrote:

> I thought I was actually going to enter my first RubyQuiz, but I've  
> spent three times as much time trying to get Ruby to stop  
> surprising me as I have trying to implement my algorithm, and I've  
> had to abandon my effort since I don't have the time to spend. Sigh.
>
> Can somebody explain to me how I'm supposed to delete a *single*  
> element from an array based on equivalence with an object? and get  
> back said array with said element deleted?
>
> In other words....
>
> ar = [1, 2, 3, 8, 15, 15, 8]
>
> ar.delete_one_element!(15)
> => [1, 2, 3, 8, 15, 8]
>
> ar.delete_one_element!(14)
> => [1, 2, 3, 8, 15, 15, 8]
>
> ar.delete_one_element!(nil)
> => [1, 2, 3, 8, 15, 15, 8]
>
> I did find so many different ways of not doing this....
>
> Too enthusiastic....
> ar.delete(15)
> => 15
> ar
> => [1, 2, 3, 8, 8]
>
> Right results, wrong output...
> ar.slice!(ar.index(15))
> => 15
> ar
> => [1, 2, 3, 8, 15, 8]
>
> and also surprised me by not handling 'nil' as I wanted...
> ar.slice!(ar.index(13))
> TypeError: no implicit conversion from nil to integer
>         from (irb):8:in `slice!'
>         from (irb):8
>
>
> I mean, this seems so, er, obvious! "Please find one instance of  
> this object in the array, and return to me the array without that  
> object. If the array doesn't have that object, then just give the  
> array back to me."
>
> Why isn't that the Ruby Way? What am I missing here?
>
> Help?
>
>
>
>
require 'enumerator'
class Array
def delete_one_element(x = nil)
        if block_given?
           tester = lambda { |item| yield(item) }
        else
            tester = lambda { |item| item == x }
        end
        index_of_element = self.to_enum(:each_index).find { |i|  
tester.call(self[i]) }
        unless index_of_element.nil?
           self.delete_at(index_of_element)
        end
        self
end
end