簡體   English   中英

Ruby類成員變量現在可以了嗎?

[英]Are Ruby class member variables OK now?

去年五月,我在波特蘭的Railsconf上參加了一次演講,當時有人爭論說,在Rails中,像@@ foo這樣的Ruby類成員變量很危險,因為它們本質上是非線程安全的。

之后,我研究了這個問題,但從未找到真正充實該問題的鏈接。 我將很高興獲得指向有關Rails和線程的好文章的指針,該文章確實涉及到類成員問題。 另外,很高興知道Rail 2+和Yarv如何改變了這一方面。

編輯:

也許我對演示文稿的記憶是模糊的,但我記得@@ foo遇到的問題超出了通常的警告,即必須嚴格控制任何共享變量的訪問。 我知道Ruby代碼本身存在內存泄漏,該漏洞已在不久前修復。 我正在尋找有關Ruby共享變量和多任務的文章鏈接,越深入越好。 *目前,由於這個原因,我什么也不使用類變量,但是在某些情況下能夠使用它們會很好。

任何共享的可變狀態本質上都是線程不安全的。 您需要鎖定所有訪問權限,以確保所有內容都是安全的,並確保所有內容都是可重入的。 @@foo尤其糟糕,因為更難審核代碼,因為任何子類都可以訪問該變量。 Rails 2+通過審核所有內容並確保在必要時使用了互斥鎖和其他同步原語,才“解決了”問題。

我認為它們像以前一樣還可以,但是在Rails環境中仍要謹慎使用,在該環境中類可能會多次加載(例如,如果您使用雜種,則每個雜種一次),因此類成員變量可以在這些過程中獨立變化。

我認為Ruby 1.9中@@變量有一個范圍界定更改,可能應該考慮到這一點-我們將有一天都在那里。

您是否有特定用途? 我以為我最近需要一個,但是事實證明這是我對這個主題的(粗略的)理解上的錯誤-我真正需要的是該類上的一個實例變量。 (我正在構建一個模塊來擴展類,以便可以添加一些AR風格的聲明性宏。)

暫無
暫無

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

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