【问题标题】:Accessing local variable from inline agent从内联代理访问局部变量
【发布时间】:2012-06-20 12:59:04
【问题描述】:

我正在尝试实现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]

【问题讨论】:

    标签: agent eiffel


    【解决方案1】:

    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
    

    【讨论】:

    • 它有效(必须修复相等测试中的错误,需要对象而不是引用相等)
    • 是(隐藏的)参数列表,只是(?)?我再看看说明书。
    • @richard,如果没有明确的参数列表,所有的参数都被认为是开放的。这相当于添加一个显式参数列表,其中包含与代理声明中的正式参数一样多的问号。当然,如果所有参数都是开放的,那么完全省略参数的显式列表会更方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多