2

我正在尝试实现dos_key_exist,我认为下面的代码可以做到。但我得到一个编译错误 key not found 行:Result := not (x.key = key)

does_key_exist(key: attached STRING):BOOLEAN
    do
        Result := not data.item(hash(key)).for_all (agent (x:like pair_at):BOOLEAN
            do
                Result := not equal(x.key, key)
            end)
    end

定义:

pair_at(key:attached STRING):TUPLE[key:STRING;value: like value_at]
    require
        does_key_exist(key)
    deferred
    ensure
    end

list_at(key:STRING) : LINKED_LIST[like pair_at]
        require
            does_key_exist(key)
        end

data : ARRAY[like list_at]
4

1 回答 1

2

Eiffel 中的内联代理可以访问当前对象的属性,但不能访问局部变量或参数,因为它们只是“正常”代理的语法糖,它们是根据类的正常特征构建的。后者无法访问其他功能的本地变量或参数。因此,可以通过显式传递参数来更正代码:

does_key_exist (key: STRING): BOOLEAN
    do
        Result := not data.item (hash (key)).for_all
            (agent (x: like pair_at; y: STRING): BOOLEAN
                do
                    Result := not equal(x.key, y)
                end
            (?, key))
    end
于 2012-06-20T18:51:51.227 回答