开发者

Ruby block method help

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 goin开发者_JS百科g 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!


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜