Справка по методам Ruby block - PullRequest
0 голосов
/ 08 июня 2011

Я пытался выяснить, могу ли я восстановить итератор delete_if класса Array как свой собственный метод, чтобы проверить, правильно ли я понял методы и блоки.Вот что я кодировал:

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}

Это привело к ошибке, говорящей о том, что метод% не может быть идентифицирован в последней строке.Я знаю, что значение будет целым числом, поэтому я не уверен, почему он скажет эту ошибку.Может кто-нибудь объяснить, пожалуйста?Кроме того, в Ruby в целом, как вы можете быть уверены, что кто-то передает правильный тип в метод?Что если метод должен принимать строку, но она передается в виде целого числа - как вы это предотвратите ??

Спасибо!

1 Ответ

1 голос
/ 08 июня 2011
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

Вещи, которые я исправил:

  • необходимо изменить массив, если все, что вы делаете, это присваиваете параметр, ваши изменения будут локальными для метода.И в этом отношении вы присваивали вычисляемый объект массива элементу исходного массива, что было непосредственной причиной сообщения об ошибке.

  • , так как массив может стать короче, нам нужно выручить в (новом) конце

  • Конечно, вы можете просто использовать arr.delete_at x но я не смог исправить назначение среза, не сохранив кодовый паттерн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...