Справка по методу Ruby block

#ruby #ruby-on-rails-3 #methods

#ruby #ruby-on-rails-3 #методы

Вопрос:

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

 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:

 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
  

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

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

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

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