Logan Capaldo
2/4/2006 9:11:00 PM
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