0

I was trying to see if I could reconstruct the Array class' delete_if iterator as my own method in order to see if I understood methods and blocks correctly. Here is what I coded:

def delete_if(arr)
    for x in 0...arr.length
        if (yield arr[x])
            arr[x]=arr[x+1,arr.length]
            redo
        end
    end
end

arr = [0,1,2,3,4,5]
delete_if(arr) {|value| value % 2 == 0}

This resulted in an error saying that the % method could not be identified in the last line. I know that value is going to be an integer so I am not sure why it would say this error. Can someone please explain? Also, in Ruby in general, how can you be sure that someone passes the correct type into a method? What if the method is supposed to take a string but they pass in an integer -- how do you prevent that??

Thanks!

1 Answer 1

1
def delete_if arr
  for x in 0...arr.length
    return if x >= arr.length
    if yield arr[x]
      arr[x..-1] = arr[(x + 1)..-1]
      redo
    end
  end
end

Things I fixed:

  • it's necessary to mutate the array, if all you do is assign to the parameter, your changes will be local to the method. And for that matter, you were assigning your calculated array object to an element of the original array, which was the immediate cause of the error message.

  • since the array may become shorter, we need to bail out at the (new) end

  • of course you could just use arr.delete_at x but I couldn't correct the slice assignment without keeping the code pattern

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.