简短的回答
如果some_object
是局部变量,则没有必要引入对象 test local l_some_object
。
长答案
对象测试的一般形式是
attached {SOME_TYPE} expr as var
where{SOME_TYPE}
和var
是可选的。当不使用类型({SOME_TYPE}
在上面的示例中)时,对象测试只是检查是否expr
已附加,并将其值分配给var
何时附加。
从理论上讲,可以预期以下内容是无效安全的:
if attached expr then
expr.do_something
end
然而,这在一般情况下是不允许的,因为expr
它可能会产生副作用,因此在第二次计算时,会返回一个不同的值,并且该值可能void
会使代码无效:
if attached foo then -- On first call function foo returns non-void value.
foo.do_something -- On second call function foo returns void: BOOM!
end
另一种可能性是更改表达式值的中间调用,例如,
if attached attr then -- Attribute attr is attached here.
bar -- bar sets attr to Void.
attr.do_something -- BOOM!
end
如果bar
将属性设置attr
为void
(这可以间接完成),则代码再次为 void-unsafe。
最后,在多线程环境中,attr
即使没有任何中间功能调用,另一个线程也可以在检查之后和在“then”部分使用之前更改值:
if attached attr then -- Attribute attr is attached here.
-- Another thread sets attr to Void.
attr.do_something -- BOOM!
end
为了防止这些情况,var
使用了该部件。此对象测试本地是只读的,不受对同一表达式的评估、任何中间功能调用或另一个线程的影响。换句话说,它始终是附加的。
仍然在某些情况下,对象测试表达式不受这些因素的影响:
参数是只读的,因此使用缩写形式总是足够的
attached arg
并且在本地引入对象测试是没有意义的,因为它总是等于参数。
局部变量,Result
只有Void
当它们被分配一个可分离的表达式时才可能成为。如果没有这样的赋值,同样
attached local_var
很好。然而,一旦本地被分配了一个可分离的表达式,它就不再被认为是附加的:
if attached local_var then
... -- OK to use local_var as attached.
local_var := detachable_expression
... -- No guarantees about local_var attachment status.
end
如果不需要这种情况,可以使用长形式的对象测试
attached local_var as attached_local_var
它保证attached_local_var
始终连接。