Я создал небольшое приложение для магазина в Ruby.Концепция проста: я хочу иметь возможность добавлять, удалять и просматривать «базу данных» в этом примере.Код, кажется, работает;однако, он не ведет себя так, как можно было бы ожидать.Я могу добавить любой товар просто отлично, но когда я пытаюсь удалить его по определенному критерию, который соответствует каждому элементу, удаляются только некоторые из них.
class Store
PRODUCT = Struct.new(:identifier, :parameters)
def initialize(database = [])
@database = database
end
def increment
# Increment the unique identifier if the database is not empty
# Otherwise, set the initial value for the unique identifier
@database.any? ? @database.map { |object| object[:identifier] }.max + 1 : 1
end
def add(product)
@database.push(identifier: increment, parameters: product)
end
def remove(product)
@database.each do |object|
product.each do |key, value|
@database.delete(object) if object[key] == value
@database.delete(object) if object[:parameters][key] == value
end
end
end
def view
puts @database
puts "\n"
end
end
store = Store.new
store.add(name: 'Fanta', volume: 33, unit: 'centiliter', count: 48, price: 9.95, currency: 'SEK')
store.add(name: 'Sprite', volume: 33, unit: 'centiliter', count: 48, price: 9.95, currency: 'SEK')
store.add(name: 'Coca-Cola', volume: 33, unit: 'centiliter', count: 48, price: 9.95, currency: 'SEK')
store.view
store.remove(price: 9.95)
store.view
В этом примере будут добавлены три произвольных элемента к Store
экземпляр и список содержимого, найденного в массиве @database
.Этот массив, конечно, будет содержать значения:
{:identifier=>1, :parameters=>{:name=>"Fanta", :volume=>33, :unit=>"centiliter", :count=>48, :price=>9.95, :currency=>"SEK"}}
{:identifier=>2, :parameters=>{:name=>"Sprite", :volume=>33, :unit=>"centiliter", :count=>48, :price=>9.95, :currency=>"SEK"}}
{:identifier=>3, :parameters=>{:name=>"Coca-Cola", :volume=>33, :unit=>"centiliter", :count=>48, :price=>9.95, :currency=>"SEK"}}
Затем код переходит к удалению любого продукта по цене 9,95, которая должна соответствовать всем продуктам в массиве @database
.Однако, когда я перечисляю его содержимое еще раз, остается один продукт:
{:identifier=>2, :parameters=>{:name=>"Sprite", :volume=>33, :unit=>"centiliter", :count=>48, :price=>9.95, :currency=>"SEK"}}
Я не могу найти никакой логики для этого.Почему мой метод remove
не удаляет все элементы, если условие выполняется для каждого сравнения?