Re: Quiz #65, Principle of Great Surprise, and Array.delete sledgehammer




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




.



Relevant Pages

  • Re: attr_accessor
    ... nil, ... overrides every mutating method of Array to provide the same checking for ... array attributes as well. ... Q. What is THE Ruby book for Rails developers? ...
    (comp.lang.ruby)
  • Re: When introspection doesnt...
    ... How does Ruby choose which method to invoke? ... souped-up Array behavior. ... Q. What is THE Ruby book for Rails developers? ...
    (comp.lang.ruby)
  • ri bug and bugfix
    ... The current ri in ruby ) fails with some ... convert nil into Array (TypeError) ... This ensured that ri didn't barf when old.comment was nil. ...
    (comp.lang.ruby)
  • Re: Multiple Assignments: Newbie question
    ... many times, if you think ruby, think ruby objects,.. ... at this point ruby sees a comma, but ruby assignment treats rhs as a list, ergo array assignment. ... so the comma rules. ...
    (comp.lang.ruby)
  • Re: Array.Clear vs List<>.Clear
    ... that creating a great big value array was still faster. ... That in mind, your results aren't all that surprising to me, as it's ... internal framework function. ... just eventually call some sort of memset variant (which is really ...
    (microsoft.public.dotnet.languages.csharp)