2010-02-17 69 views
5

我一直在努力嘗試,以便更好地瞭解Ruby和這裏內的全球性就是我遇到的麻煩事:設置一個進程

$SAFE = 1 
puts $SAFE # 1 
proc { 
    $SAFE = 2 
    puts $SAFE # 2 
}.call 
puts $SAFE # 1 

上面的代碼部分由再培訓局的源代碼重寫,以更好地突出拍攝這個例子。基本上在proc中,可以將$SAFE的值設置爲任何想要的值,在proc之後,SAFE的值返回到proc之前的值。

如果不是使用I它改變到不同的字的字$SAFE,如$DOOR

$DOOR = 1 
puts $DOOR 
proc { 
    $DOOR = 2 
    puts $DOOR 
}.call 
puts $DOOR 

然後$DOOR的PROC後的值是2,而不是1。爲什麼這兩者之間的差例子?

回答

11

這是相當簡單,真正做到:爲什麼$SAFE的行爲不像你所期望的那樣是因爲它不是一個全局變量。這是一個神奇的獨角獸thingamajiggy。

在Ruby中有很多這些神奇的獨角獸thingamajiggies,而且不幸的是他們沒有很好的文檔記錄(實際上根本沒有記錄),因爲其他Ruby實現的開發者發現了困難的方式。這些東西的動作都表現出不同的(看起來)不一致,而且他們唯一的兩個共同點是他們看起來像全局變量,但不像他們那樣表現。

一些有局部範圍。有些具有線程本地範圍。有些神奇地改變,沒有任何人分配給他們。有些對解釋者有着神奇的意義,並改變了語言的行爲方式。有些人會附加其他奇怪的語義。

$SAFE幾乎所有上述內容:它是線程本地的,這意味着如果您在一個線程中更改它,它不會影響其他線程。它是本地的,也就是說,如果您在本地範圍內(如類,模塊,方法或塊)更改它,它不會影響外部範圍(如您所發現的那樣)。它對解釋器有着神奇的含義,因爲將其設置爲與0不同的值會使某些事情不起作用。它有額外的怪異的語義,你永遠只能增加它的價值,從來沒有減少它。

+0

好吧,那正是我想知道的。我正在尋找並希望保持一致,但在這裏我發現我們正在處理一個神奇的獨角獸thingamajiggy。 :-) – Francois

3

我不知道爲什麼$ SAFE正在以這種方式工作,但我確實知道它是一個預定義的全局變量,具有與受污染的外部數據和線程相關的魔術含義。

所以不要將它用作程序對象。

參見http://ruby-doc.org/docs/ProgrammingRuby/html/taint.html

它不是,順便說一句,應該是可以降低的$ SAFE與工作分配的值,但它被附接到執行上下文和多線程程序,例如,可以有多個$ SAFE在不同線程中的值...

+0

我沒上污點的東西讀了,我也看到,$ SAFE是一個預定義的全局變量。但我不太明白爲什麼預定義的全球變量與其他全局變量行爲不同。 – Francois

+1

原因因變量而異,在$ SAFE的情況下,這是因爲整個問題的關鍵在於單向升級偏執狂。如果$ SAFE可以通過分配減少,注入的代碼可以簡單地包含一個$ SAFE分配。 – DigitalRoss

1

$DOOR的值必須是2。因爲$DOOR全局變量已從1重新初始化爲2。有關Global Variables的更多詳細信息。

$SAFE安全級別通過設置$SAFE變量。默認情況下它是 設置爲零。

和proc內$SAFE將是一個有記憶,直到範圍結束.Hence它是顯示預先設定的值,即1,檢查更該heredocs

相關問題