【发布时间】:2016-05-06 20:36:52
【问题描述】:
在 Eiffel 中,Void Safety 是一种静态防止取消引用未初始化(“null”)对象的方法。它的工作方式是,首先,必须将对象声明为可拆卸,然后您需要在 if 块中检查该对象是否实际 附加(即有一些价值),然后才能使用它。
这是我一直使用到现在的方式:
some_object: detachable TYPE
...
if attached some_object then
some_object.method
end
工作得很好:没有附加检查,编译失败并出现“Object_call 的目标可能无效”错误。 然而,在实际阅读了关于 Void Safety 的documentation 之后,我了解到它实际上应该是这样的:
some_object: detachable TYPE
...
if attached some_object as l_some_object then
l_some_object.method
end
在这种形式中,l_some_object 是一个 if 块的局部变量,它与 some_object 指向同一个对象,但静态保证为非 void。
但是,我看不出这个 as-clause 存在的原因。正如我上面所指出的,显然原始的some_object 在 if 块中已经静态保证为非 void,那么引入另一个变量有什么意义呢?
some_object 和l_some_object 除了作用域之外有什么区别?
【问题讨论】:
标签: void eiffel void-safety