必须通过强制检查将附加的本地声明为可分离属性的语义

时间:2019-08-30 00:53:36

标签: eiffel

据我了解,checkthen是强制性的。

那么必须声明一个局部变量以避免编译错误(object could be void)的语义是什么?

detachable dog: DOG

take_a_walk
    do
        check
            attached_dog: attached dog as l_dog
        then
            leash (l_dog) -- why not just leash (dog)?
            walk
        end
    end     

2 个答案:

答案 0 :(得分:2)

有两个主要原因说明,在附加了空性测试之后,无法使用可分离类型的属性:

  1. 在无效性测试之后的一系列调用中,不仅涉及一次调用,而且几乎无法弄清楚该属性是否仍附加。这是一个带有属性x的示例:

    if attached x then
        foo
        x.bar
    end
    

    foo的调用可以将Void分配给属性x。因此,呼叫x.bar现在是不安全的(可能导致对Void目标的呼叫)。用语言来讲,x应该被认为是可分离的,而与早期的空缺测试无关。 (与x是局部变量时的使用进行比较:对foo的调用不能更改x,并且对调用x.bar的使用也可以。)

    < / li>
  2. 在多线程环境中,可以在后台更改属性的值。让我们考虑带有属性x的以下示例:

    if attached x then
        x.bar
    end
    

    这是导致问题的执行顺序:

    • 已测试属性x的无效性,并且attached x给出了True
    • 另一个线程获得控制权并执行x := Void
    • 将控件返回到原始线程,并在x.bar目标上执行调用Void

如示例1所示,如果x是局部变量,则代码就可以了。

以上所有推论均假设可以为属性分配Void。如果这是错误的,即无法进行此类分配怎么办?在这种情况下,可以将属性标记为stable

x: detachable FOO
    note
        option: stable
    attribute
    end

然后,在void安全性方面,该属性表现为局部变量,上面的所有代码段均有效并且可以正确编译。

答案 1 :(得分:0)

因为该属性可能在另一个线程中设置为空