Este es un problema más complicado de lo parece. He definido las siguientes pruebas:
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
propuesto por @Duopixel es elegante pero produce [3, 2, 1]
para la segunda prueba.
class Array
def promote(promoted_element)
sort_by { |element| element == promoted_element ? 0 : 1 }
end
end
@tadman utiliza delete
, pero esto elimina todos los elementos coincidentes, por lo que la salida de la cuarta prueba es [2, 1, 3, 1, 3]
.
class Array
def promote(promoted_element)
if (found = delete(promoted_element))
unshift(found)
end
self
end
end
He intentado utilizar:
class Array
def promote(promoted_element)
return self unless (found = delete_at(find_index(promoted_element)))
unshift(found)
end
end
Pero esto falló la tercera prueba, ya que no puede manejar delete_at
nula. Por último, que se establecieron en:
class Array
def promote(promoted_element)
return self unless (found_index = find_index(promoted_element))
unshift(delete_at(found_index))
end
end
¿Quién sabía que una idea tan simple como promote
podría ser tan complicado?
el la pregunta no está clara, usted solicita una forma más legible de "colocar un elemento al frente de una matriz" ('Array # insert (index, value)'?) pero el ejemplo usa 'delete' y parece que usted quería un rotación. – tokland
He reformulado la pregunta. – Duopixel
bien, ahora está claro. Sin embargo, ¿tiene que ser una actualización in situ? ¿por qué no devolver una nueva matriz? – tokland