簡體   English   中英

必須通過強制檢查將附加的本地聲明為可分離屬性的語義

[英]semantic of having to declare an attached local into detachable attribute with mandatory check

據我了解, thencheck是強制性的。

那么,必須聲明一個局部變量以避免編譯錯誤( 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     

有兩個主要原因可解釋為什么在附加了空性測試后無法使用可分離類型的屬性:

  1. 一旦在無效性測試之后進行的一系列調用涉及的不僅僅是單個調用,幾乎就無法確定該屬性是否仍附加。 這是一個具有x屬性的示例:

     if attached x then foo x.bar end 

    foo的調用可以將Void分配給屬性x 因此,調用x.bar現在不安全(可能導致對Void目標的調用)。 用語言來講,無論較早的空隙度測試如何, x都應視為可分離的。 (將此與當x是局部變量時的使用進行比較:對foo的調用不能更改x ,並且對x.bar的調用是可以的。)

  2. 在多線程環境中,可以在后台更改屬性的值。 讓我們考慮以下帶有屬性x示例:

     if attached x then x.bar end 

    這是導致問題的執行順序:

    • 測試了屬性x的虛度, attached x給出True
    • 另一個線程獲得控制權並執行x := Void
    • 控件返回到原始線程,並在Void目標上執行x.bar調用。

如示例1所示,如果x是局部變量,則代碼就可以了。

以上所有推理均假定可以為屬性分配Void 如果這是錯誤的,即不可能進行此類分配怎么辦? 在這種情況下,可以將屬性標記為stable

x: detachable FOO
    note
        option: stable
    attribute
    end

然后,就無效性安全性而言,該屬性充當局部變量,以上所有代碼段均有效並且可以正確編譯。

因為該屬性可能在另一個線程中被設置為void

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM