必须通过强制检查将附加本地声明为可分离属性的语义
semantic of having to declare an attached local into detachable attribute with mandatory check
据我了解,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
因为该属性可能会在另一个线程中设置为 void
可分离类型的属性在其无效性测试后无法使用的主要原因有两个:
一旦无效性测试后的一系列调用涉及的不仅仅是一个调用,就几乎不可能弄清楚该属性是否仍然附加。这是一个带有属性 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安全性方面,该属性表现为一个局部变量,上面的所有代码片段都有效并且编译没有错误。
据我了解,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
因为该属性可能会在另一个线程中设置为 void
可分离类型的属性在其无效性测试后无法使用的主要原因有两个:
一旦无效性测试后的一系列调用涉及的不仅仅是一个调用,就几乎不可能弄清楚该属性是否仍然附加。这是一个带有属性
的示例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安全性方面,该属性表现为一个局部变量,上面的所有代码片段都有效并且编译没有错误。