据我了解,check
和then
是强制性的。
那么必须声明一个局部变量以避免编译错误(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
答案 0 :(得分:2)
有两个主要原因说明,在附加了空性测试之后,无法使用可分离类型的属性:
在无效性测试之后的一系列调用中,不仅涉及一次调用,而且几乎无法弄清楚该属性是否仍附加。这是一个带有属性x
的示例:
if attached x then
foo
x.bar
end
对foo
的调用可以将Void
分配给属性x
。因此,呼叫x.bar
现在是不安全的(可能导致对Void
目标的呼叫)。用语言来讲,x
应该被认为是可分离的,而与早期的空缺测试无关。 (与x
是局部变量时的使用进行比较:对foo
的调用不能更改x
,并且对调用x.bar
的使用也可以。)
在多线程环境中,可以在后台更改属性的值。让我们考虑带有属性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)
因为该属性可能在另一个线程中设置为空