Dies ist ein heikler Problem, als es scheint. I definiert die folgenden Tests:
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
von @Duopixel vorgeschlagen ist elegant, aber produziert [3, 2, 1]
für den zweiten Test.
class Array
def promote(promoted_element)
sort_by { |element| element == promoted_element ? 0 : 1 }
end
end
@tadman delete
verwendet, aber dies löscht alle passenden Elemente, so dass der Ausgang des vierten Test ist [2, 1, 3, 1, 3]
.
class Array
def promote(promoted_element)
if (found = delete(promoted_element))
unshift(found)
end
self
end
end
ich versucht, mit:
class Array
def promote(promoted_element)
return self unless (found = delete_at(find_index(promoted_element)))
unshift(found)
end
end
aber, dass der dritte Test nicht bestanden, weil delete_at
nil nicht verarbeiten kann. Schließlich ließ ich mich auf:
class Array
def promote(promoted_element)
return self unless (found_index = find_index(promoted_element))
unshift(delete_at(found_index))
end
end
Wer eine einfache Idee wie promote
wusste so schwierig sein könnte?
der Frage ist nicht klar, Sie fragen nach einer besser lesbaren Möglichkeit, "ein Element an die Front eines Arrays zu platzieren" ('Array # insert (index, value)'?), aber das Beispiel verwendet 'delete 'und scheint so, als wollten Sie ein Drehung. – tokland
Ich habe die Frage umformuliert. – Duopixel
ok, jetzt ist es klar. Muss es in-Place-Update sein, obwohl? Warum gibst du kein neues Array zurück? – tokland