Đây là một vấn đề phức tạp hơn so với nó có vẻ. Tôi định nghĩa các xét nghiệm sau:
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
bởi @Duopixel đề xuất là thanh lịch nhưng sản xuất [3, 2, 1]
cho kỳ thi thứ hai.
class Array
def promote(promoted_element)
sort_by { |element| element == promoted_element ? 0 : 1 }
end
end
@tadman sử dụng delete
, nhưng điều này sẽ xoá tất cả các yếu tố phù hợp, vì vậy đầu ra của thử nghiệm thứ tư là [2, 1, 3, 1, 3]
.
class Array
def promote(promoted_element)
if (found = delete(promoted_element))
unshift(found)
end
self
end
end
tôi đã cố gắng sử dụng:
class Array
def promote(promoted_element)
return self unless (found = delete_at(find_index(promoted_element)))
unshift(found)
end
end
Nhưng điều đó đã không kiểm tra thứ ba vì delete_at
không thể xử lý nil. Cuối cùng, tôi quyết định chọn:
class Array
def promote(promoted_element)
return self unless (found_index = find_index(promoted_element))
unshift(delete_at(found_index))
end
end
Ai biết một ý tưởng đơn giản như promote
có thể là rất khó khăn?
câu hỏi không rõ ràng, bạn yêu cầu một cách dễ đọc hơn "đặt một phần tử vào trước một mảng" ('Chèn # mảng (chỉ mục, giá trị)'?) nhưng ví dụ sử dụng 'xóa' và có vẻ như bạn muốn Vòng xoay. – tokland
Tôi đã lặp lại câu hỏi. – Duopixel
ok, giờ đã rõ. Mặc dù nó có được cập nhật tại chỗ không? tại sao không trả về một mảng mới? – tokland