2014-10-09 3 views
1

Хорошо, я знаю, что Руби богат все виды методов, что позволяет исключить из массива, такие как сдвиг, поп, удаление, капля и т.д.Попытки удалить элементы из массива

Но если вы пытаетесь переписать методы без использования этих методов, тогда как выяснить, как удалить элементы из массива?

Если есть массив, скажем, a = [10, 2, 7, 5] и вы хотите удалить 2 элемента из него, a[0] и a[1], как drop method, как же это сделать?

Рекомендации?

EDIT

К сожалению, должен были бы сделать это яснее - я пытаюсь сделать это без любых методов из любого массива или перечислимой библиотеки.

EDIT TWO

Ого, так много комментарий! =) Опять же, прошу прощения. Я все время забываю упомянуть, что единственный способ, который я позволяю себе использовать, - это размер. Но помимо этого, все это упражнение, которое я предпринял (читая сумасшедшую сумасшедшую схему хита), на самом деле было для меня довольно образованным. Это заставляет меня реально понять, что происходит за методами в хорошем смысле.

Извините, что я не знаю, как прояснить этот вопрос, кроме того, что я сказал здесь.

Я понимаю, что хотя этот вопрос может быть не лучшим использованием времени, так как у Ruby есть удивительные методы, я прошу причину, и это значит, что это для моего собственного просветления, в котором мне нужна помощь в определении и т. д.

Если есть что-то еще, я могу пролить свет дальше, пожалуйста, спросите. В противном случае, спасибо всем людям, которые ответили! Большое спасибо.

+0

Нам действительно нужен "WTF for ?!" близко причина. –

+0

Вам необходимо предоставить дополнительную информацию. Например, если вы не хотите использовать методы Array или Enumerable, вы должны указать этот фактический ввод или ваш прецедент. – Max

+1

Вы не можете изменить массив (или любой правильно инкапсулированный объект) без использования его методов. – Stefan

ответ

-1

Попробуйте это:

class Array 
    def my_drop_method(i) 
    self[i..self.size] 
    end 
end 

Теперь с помощью этого метода:

a = [10, 2, 7, 5] 
a.my_drop_method(2) 
=> [7, 5] 

self является текущим объектом в context.

здесь в пределах my_drop_method экземпляр метода self равен [10, 2, 7, 5], то есть a.

попробовать это:

Это новый ответ в соответствии с обновленным вопросом:

a = [10, 2, 7, 5] 
    => [10, 2, 7, 5] 
    n = 2 // number of elements to remove 
    => 2 
    r = Regexp.new('\d+,' * n) 
    => /\d+,\d+,/ 
    a.to_s.gsub(/\[|\]|\s/,'').match(r).post_match.split(',') 
    => ["7", "5"] 
+0

Вау, это здорово. Мне это нравится, хотя я не привык думать в себе. Спасибо! Если вы знаете какие-либо другие способы сделать это, я был бы признателен! – user273072545345

+0

@ пользователь27307254534534534543 проверка обновленный ответ. –

+2

OP говорит * no * методы из 'Array' или' Enumerable', поэтому [Array # [\]] (http://www.ruby-doc.org/core-2.1.1/Array.html#method- i-5B-5D) запрещено! Вы можете использовать только карманный нож и коробку спичек. –

0

Вы можете использовать delete_at метод, который

Удаляет элемент по указанному индексу, возвращая этот элемент, или ноль, если индекс находится вне диапазона.

+0

Да, нет, я имел в виду без каких-либо методов из библиотеки Array или Enumerable. Извините, я должен был сделать это различие более ясным. Моя вина. – user273072545345

0

Вы имеете в виду, как Руби выполняет его? Нажмите кнопку «Кликнуть, чтобы переключить источник», которая появляется, когда вы наводите курсор на описание функции на связанной странице. Вы имеете в виду, как бы вы справились без drop, shift или delete? Используйте slice!. Или вы имеете в виду даже без этого? Перебирайте элементы и перемещайте их по одному, но это вряд ли быстро.

EDIT: «без каких-либо методов из любого массива или перечислимых библиотеки»: вы не можете сделать это без каких-либо методов из Array, поскольку любое взаимодействие с Array будет проходить через метод в Array.Этот код будет делать это (или что-то очень близкое к этому) без других, чем [], []= и size любых Array методов (и new для diy_drop):

class Array 
    def diy_drop!(x) 
    new_size = size - x 
    size.times do |i| 
     self[i] = i < new_size ? self[i + x] : nil 
    end 
    self 
    end 

    def diy_drop(x) 
    result = [] 
    (size - x).times do |i| 
     result[i] = self[i + x] 
    end 
    result 
    end 
end 

Для diy_drop!, это ближайший вы можете получить; массив будет оставлен с некоторым dangly nil s, потому что нет способа изменить размер Array, кроме одного из тех методов, которые вы хотите реализовать. Это не проблема с diy_drop, так как он создает новый массив.

a = [1, 2, 3, 4, 5] 
a.diy_drop(2) 
# => [3, 4, 5] 
a 
# => [1, 2, 3, 4, 5] 
a.diy_drop!(2) 
# => [3, 4, 5, nil, nil] 
a 
# => [3, 4, 5, nil, nil] 

Вы также можете «обмануть» и использовать [] и []= методы с параметром Диапазон:

class Array 
    def diy_cheat_drop!(x) 
    self[0..size] = diy_cheat_drop(x) 
    end 

    def diy_cheat_drop(x) 
    self[x..size] 
    end 
end 

(я говорю «обмануть», потому что с помощью тех, кто в значительной степени эквивалентно использованию различных удаления ./срез функции)

+0

Да, я знаю, что это не скоро. Не в этом дело. То, что я заставляю себя сумасшедшим, все это думать о том, как это сделать, не полагаясь на эти методы. Ruby действительно потрясающе в том, что у вас так много методов, которые делают вашу жизнь настолько намного проще.Я знал, что Ruby был потрясающим, но я понятия не имел, насколько это потрясающе, пока я не приступлю к этой схеме, чтобы узнать больше о библиотеке Enumerable. – user273072545345

+0

также, если вы знаете, как перемещаться по элементам, перемещать их и т. Д., Можете ли вы показать, как, пожалуйста? – user273072545345

+0

ах, извините! Я полностью забыл, что размер разрешен. Единственная функция на самом деле. Мой мозг полностью ошеломлен, думая так, как я привык. Или переоценить. Хотя на данный момент это больше похоже на переход в циклы и неспособность видеть лес, потому что. Спасибо, что написали это! Больше для меня, чтобы учиться! – user273072545345

0

Я точно знаю, что вы имеете в виду: использование Array и Enumerable методы могут стать настолько ужасно утомительный. К сожалению, для массивов в целом я не думаю, что вы можете делать то, что хотите, без использования хотя бы одного метода из этого класса или этого модуля.

Если, однако, все элементы массива являются строками, есть способы. Если это один из тех дней, когда я просто надоела Array и Enumerable методов, я хотел бы использовать Object#to_enum, Enumerator#next, Kernel#loop и три String методы:

a = ["a","b","c","d","e"] 

enum = a.to_enum 
enum.next 
enum.next 
str = '' 
loop do 
    s = enum.next 
    str << "#{s} " 
end 
str.split 
    #=> ["c", "d", "e"] 

Конечно, Array включает Object методы, но это Безразлично Нет.

+0

Не уверен, что это соответствует. Перечислитель вызывает 'a.each' для перечисления массива :-) – Stefan

+0

Что такое _time_ там? : D –

+0

@Arup, поздно. Слишком поздно. O & O. –

Смежные вопросы