gpt4 book ai didi

void - Eiffel 的附加语句中的局部变量有什么意义?

转载 作者:行者123 更新时间:2023-12-01 23:30:47 25 4
gpt4 key购买 nike

在 Eiffel 中,Void Safety 是一种静态防止取消引用未初始化(“null”)对象的方法。它的工作方式是,首先,该对象必须声明为可分离,然后您需要检查一个 if block 是否该对象实际上是附加(即具有一定的值(value)),然后才能使用它。

这是我到现在为止一直使用它的方式:

some_object: detachable TYPE

...

if attached some_object then
some_object.method
end

工作得很好:没有附加检查,编译失败并出现“Object_call 的目标可能无效”错误。然而,在实际阅读 documentation 之后在 Void Safety 上,我了解到这实际上应该是这样的:

some_object: detachable TYPE

...

if attached some_object as l_some_object then
l_some_object.method
end

在这种形式中,l_some_objectif block 的局部变量,它指向与 some_object 相同的对象,但静态保证是非空的。

但是,我看不出这个 as-clause 存在的原因。正如我上面指出的,显然原始的 some_object 已经静态地保证在 if block 中是非空的,那么引入另一个变量有什么意义呢?

除了范围之外,some_objectl_some_object 之间有什么区别?

最佳答案

简答

如果 some_object 是一个局部变量,那么引入一个对象测试局部 l_some_object 是没有意义的。

长答案

对象测试的一般形式是

attached {SOME_TYPE} expr as var

其中 {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。

最后,在多线程环境中,即使没有任何中间功能调用,另一个线程也可以在检查之后和在“then”部分使用之前更改 attr 的值:

if attached attr then -- Attribute attr is attached here.
-- Another thread sets attr to Void.
attr.do_something -- BOOM!
end

为了防止这些情况,使用了 var 部分。此对象 test local 是只读的,并且不受同一表达式的评估、任何中间功能调用或另一个线程的影响。换句话说,它总是附加的。

仍然在某些情况下,对象测试表达式不受这些因素的影响:

  1. 参数是只读的,所以使用缩写形式总是足够的

    attached arg

    并且引入对象测试本地是没有意义的,因为它总是等于参数。

  2. 局部变量和 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 始终附加。

关于void - Eiffel 的附加语句中的局部变量有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com