To jest trudniejsze problemem niż to wydaje się. I zdefiniowano następujące testy:
describe Array do
describe '.promote' do
subject(:array) { [1, 2, 3] }
it { expect(array.promote(2)).to eq [2, 1, 3] }
it { expect(array.promote(3)).to eq [3, 1, 2] }
it { expect(array.promote(4)).to eq [1, 2, 3] }
it { expect((array + array).promote(2)).to eq [2, 1, 3, 1, 2, 3] }
end
end
sort_by
proponowany przez @Duopixel jest elegancki, ale produkuje [3, 2, 1]
dla drugiego testu.
class Array
def promote(promoted_element)
sort_by { |element| element == promoted_element ? 0 : 1 }
end
end
@tadman wykorzystuje delete
, ale ta usuwa wszystkie elementy pasujące, więc wyjście czwartego testu jest [2, 1, 3, 1, 3]
.
class Array
def promote(promoted_element)
if (found = delete(promoted_element))
unshift(found)
end
self
end
end
Próbowałem za pomocą:
class Array
def promote(promoted_element)
return self unless (found = delete_at(find_index(promoted_element)))
unshift(found)
end
end
Ale udało trzecią próbę ponieważ delete_at
nie może obsłużyć nil. Wreszcie zdecydowałem się na:
class Array
def promote(promoted_element)
return self unless (found_index = find_index(promoted_element))
unshift(delete_at(found_index))
end
end
Kto wiedział prosty pomysł jak promote
może być tak skomplikowane?
the pytanie nie jest jasne, pytasz o bardziej czytelny sposób "umieszczania elementu z przodu tablicy" ('Array # insert (index, value)'?), ale w przykładzie użyto 'delete' i wydaje się, że chciałeś obrót. – tokland
Przeformułowałem pytanie. – Duopixel
OK, teraz jest jasne. Czy ma to być aktualizacja na miejscu? dlaczego nie zwrócić nowej tablicy? – tokland