#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
, но я не мог исправить назначение фрагмента, не сохранив шаблон кода