Обеспечить оговорку в Эйфелевой
Я выполняю задание в Eiffel, и у меня возникают проблемы с реализацией моего пункта обеспечения. Есть ли какой-то особый синтаксис, который нужно включить в переменную или функцию?
Это мой код на данный момент для моей функции "положить"
put(key: K; value: V)
require
key /= void
local
tmp:ITEM[K,V]
do
create tmp.make(key, value)
list.put_front (tmp)
count := count + 1
ensure
count = old count + 1 and list.has(key, value)
end
Это код для функции "имеет"
has(key:K; val:V):BOOLEAN
require
key /= void
local
flag: INTEGER
do
flag := 0
from
list.start
until
list.exhausted
loop
if list.item.getkey = key then
if list.item.getvalue = val then
flag := 1
end
end
list.forth
end
if flag = 1 then
Result := true
else
Result := false
end
ensure
--???
end
Назначение состоит в том, чтобы реализовать adt карты через связанный список. Функция 'put' вставляет элемент (ключ, значение) в список. Функция 'has' проверяет, содержит ли список (ключ-значение) пару.
Любая помощь будет оценена.
1 ответ
Решение
Это может быть просто
Result = across list as c some (c.item.key = key and c.item.value = value) end
Но есть еще несколько комментариев к коду:
- Я не вижу, где имущество
key /= Void
используется. Так что похоже это не обязательно. - Учитывая, что код
put
вставляет элементы типаITEM
постусловиеput
следует также использоватьacross list ... end
вместоlist.has (key, value)
, Поэтому я подозреваю, что это должно быть простоhas (key, value)
безlist.
перед ней. - Я не вижу смысла в использовании вспомогательной переменной
flag
, Зарезервированная переменнаяResult
все будет хорошо. - Все переменные в Eiffel инициализируются значениями по умолчанию, поэтому нет необходимости назначать
0
вflag
(или жеfalse
вResult
в упрощенном варианте) в начале процедуры. - Обычно в Eiffel нет необходимости иметь выделенные геттеры, поэтому обычно код
list.item.getkey
похожеlist.item.key
, - Вы можете превентивно выйти из цикла, вызвав
list.finish
который перемещает курсор к последнему элементу списка, когда требуемый элемент найден. Затем послеlist.forth
условие выхода из цикла выполняется, и цикл завершается.