On Sun, 5 Feb 2006, 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? harp:~ > cat a.rb class Array def remove(*args) replace(self - args) end end a = %w( a b b ) p a.delete_if{|x| x == "b"} a = %w( a b b ) p(a.delete("b") && a) a = %w( a b b ) p a.select{|x| x != "b"} a = %w( a b b ) p a - ["b"] a = %w( a b b c ) p a.remove("b", "c") harp:~ > ruby a.rb ["a"] ["a"] ["a"] ["a"] ["a"] there are probably more ways. hth. -a -- happiness is not something ready-made. it comes from your own actions. - h.h. the 14th dali lama